知识大全 在oracle中运行OS命令

Posted 命令

篇首语:怀抱观古今,寝食展戏谑。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在oracle中运行OS命令相关的知识,希望对你有一定的参考价值。

在oracle中运行OS命令  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    在Oracle i中 往往会出现要在存储过程中运行操作系统命令的情况 一般来说 利用Oracle Enterprise Manager设定作业时可以达到这个目的 但是由于OEM在设定作业缺乏灵活性 设定的作业的参数是固定的 在实际应用当中往往需要在SQL语句当中运行需要随时运行操作系统命令 Oracle i没有直接运行OS命令的语句 我们可以利用DBMS_PIPE程序包实现这一要求   DBMS_PIPE通过创建管道 可以让至少两个进程进行通信 Oracle的管道与操作系统的管道在概念上有相同的地方 但是在实现机制不同   下面介绍实现具体步骤:    创建一个程序包 姑且起名叫DAEMON SQL语句如下:   /*创建daemon程序包*/   CREATE OR REPLACE PACKAGE BODY daemon AS   /*execute_system是实现运行os命令的函数*/   FUNCTION execute_system(mand VARCHAR   timeout NUMBER DEFAULT )   RETURN NUMBER IS   status NUMBER;   result VARCHAR ( );   mand_code NUMBER;   pipe_name VARCHAR ( );   BEGIN   pipe_name := DBMS_PIPE UNIQUE_SESSION_NAME;   DBMS_PIPE PACK_MESSAGE( SYSTEM );   DBMS_PIPE PACK_MESSAGE(pipe_name);   DBMS_PIPE PACK_MESSAGE(mand);   /*向daemon管道发送表示命令的字符*/   status := DBMS_PIPE SEND_MESSAGE( daemon timeout);   IF status <> THEN   RAISE_APPLICATION_ERROR(    Execute_system: Error while sending Status = || status);   END IF;   status := DBMS_PIPE RECEIVE_MESSAGE(pipe_name timeout);   IF status <> THEN   RAISE_APPLICATION_ERROR(    Execute_system: Error while receiving   Status = || status);   END IF;   /*获取返回结果*/   DBMS_PIPE UNPACK_MESSAGE(result);   IF result <> done THEN   RAISE_APPLICATION_ERROR(    Execute_system: Done not received );   END IF;  DBMS_PIPE UNPACK_MESSAGE(mand_code);   DBMS_OUTPUT PUT_LINE( System mand executed result = ||   mand_code);   RETURN mand_code;   END execute_system;   /*stop是让daemon停止*/   PROCEDURE stop(timeout NUMBER DEFAULT ) IS   status NUMBER;   BEGIN   DBMS_PIPE PACK_MESSAGE( STOP );   status := DBMS_PIPE SEND_MESSAGE( daemon timeout);   IF status <> THEN   RAISE_APPLICATION_ERROR(    stop: error while sending status = || status);   END IF;   END stop;   END daemon;  通过Sql*Plus运行以上语句 将为当前用户创建daemon程序包    创建在OS上运行的守护进程 监听由上面的daemon程序包发来的要求执行os命令的语句 以下Pro*C的代码 必须由pro*c先进行预编译   #include   #include   EXEC SQL INCLUDE SQLCA;   EXEC SQL BEGIN DECLARE SECTION;   char *uid = scott/tiger ;/*在这个地方改为你自己访问的用户 密码 服务名*/   int status;   VARCHAR mand[ ];   VARCHAR value[ ];   VARCHAR return_name[ ];   EXEC SQL END DECLARE SECTION;   void   connect_error()      char msg_buffer[ ];   int msg_length;   int buffer_size = ;   EXEC SQL WHENEVER SQLERROR CONTINUE;   sqlglm(msg_buffer &buffer_size &msg_length);   printf( Daemon error while connecting:\\n );   printf( % *s\\n msg_length msg_buffer);   printf( Daemon quitting \\n );   exit( );   void   sql_error()      char msg_buffer[ ];   int msg_length;   int buffer_size = ;  EXEC SQL WHENEVER SQLERROR CONTINUE;   sqlglm(msg_buffer &buffer_size &msg_length);   printf( Daemon error while executing:\\n );   printf( % *s\\n msg_length msg_buffer);   printf( Daemon continuing \\n );      main()      EXEC SQL WHENEVER SQLERROR DO connect_error();   EXEC SQL CONNECT :uid;   printf( Daemon connected \\n );     EXEC SQL WHENEVER SQLERROR DO sql_error();   printf( Daemon waiting \\n );   while ( )   EXEC SQL EXECUTE   BEGIN   /*接收deamon发来的字符*/   :status := DBMS_PIPE RECEIVE_MESSAGE( daemon );   IF :status = THEN   /*取出字符*/   DBMS_PIPE UNPACK_MESSAGE(:mand);   END IF;   END;   END EXEC;   IF (status == )      mand arr[mand len] = \\ ;   /*如果是stop 该进程就退出*/   IF (!strcmp((char *) mand arr STOP ))      printf( Daemon exiting \\n );   break;        ELSE IF (!strcmp((char *) mand arr SYSTEM ))      EXEC SQL EXECUTE   BEGIN   DBMS_PIPE UNPACK_MESSAGE(:return_name);   DBMS_PIPE UNPACK_MESSAGE(:value);   END;   END EXEC;   value arr[value len] = \\ ;   printf( Will execute system mand %s \\n value arr);   /*运行os命令*/   status = system(value arr);   EXEC SQL EXECUTE   BEGIN   DBMS_PIPE PACK_MESSAGE( done );   DBMS_PIPE PACK_MESSAGE(:status);   :status := DBMS_PIPE SEND_MESSAGE(:return_name);   END;   END EXEC;     IF (status)      printf   ( Daemon error while responding to system mand );   printf( status: %d\\n status);         ELSE      printf   ( Daemon error: invalid mand %s received \\n   mand arr);         ELSE      printf( Daemon error while waiting for signal );   printf( status = %d\\n status);         EXEC SQL MIT WORK RELEASE;   exit( );    cha138/Article/program/Oracle/201311/17426

相关参考

知识大全 重装OS及Oracle软件,巧用RMAN恢复数据

重装OS及Oracle软件,巧用RMAN恢复数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Oracle中tnsping命令解析

Oracle中tnsping命令解析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle

知识大全 oraclesqlplus命令大全

  一ORACLE的启动和关闭  在单机环境下  要想启动或关闭ORACLE系统必须首先切换到ORACLE用户如下  suoracle  a启动ORACLE系统  oracle>svrmgrl 

知识大全 Oracle数据导入导出imp/exp命令

Oracle数据导入导出imp/exp命令  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何在

知识大全 入侵oracle数据库时常用的操作命令整理

  最近遇到一个使用了Oracle数据库的服务器在狂学Oracle+请教高手后终于搞到了网站后台管理界面的所有用户密码我发现Oracle操作起来真是太麻烦为了兄弟们以后少走些弯路我把入侵当中必需的命令

知识大全 入门oracle命令语录

  哎一学期又结束了我想把这些简单命令记录下虽然可能我不会深入研究oracle搞不好以后也会要用到的时候现在花点时间把它给存起来  怎么安装oracle软件我就不介绍了只要下个安装包接下来的安装就不在

知识大全 Oracle设置归档模式的命令

Oracle设置归档模式的命令  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle数据库

知识大全 oracle创建用户快捷命令

  createtablespacejfxtdatafileE:\\oracle\\oradata\\oradb\\jfxtorasizemreusedefaultstorage(initialkne

知识大全 Oracle归档模式的命令及参数

Oracle归档模式的命令及参数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Oracle数据库可

知识大全 cmd命令行模式

  Oracle数据导入导出imp/exp就相当于oracle数据还原与备份exp命令可以把数据从远程数据库服务器导出到本地的dmp文件imp命令可以把dmp文件从本地导入到远处的数据库服务器中利用这