Oracle如何直接运行OS命令(上)

怀孕的老男孩

怀孕的老男孩

2016-02-19 12:02

下面图老师小编要向大家介绍下Oracle如何直接运行OS命令(上),看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!
正在看的ORACLE教程是:Oracle如何直接运行OS命令(上)。

  在Oracle 8i中,往往会出现要在存储过程中运行操作系统命令的情况。一般来说,利用Oracle Enterprise Manager设定作业时可以达到这个目的。但是由于OEM在设定作业缺 乏灵活性,设定的作业的参数是固定的。在实际应用当中往往需要在SQL语句当中运行需要随时运行操作系统命令。Oracle 8i没有直接运行OS命令的语句,我们可以利用DBMS_PIPE程序包实现这一要求。 

  DBMS_PIPE通过创建管道,可以让至少两个进程进行通信。Oracle的管道与操作系统的管道在概念上有相同的地方,但是在实现机制不同。

  下面介绍实现具体步骤: 

  1、创建一个程序包,姑且起名叫DAEMON,SQL语句如下: 

  /*创建daemon程序包*/ 
  CREATE OR REPLACE PACKAGE BODY daemon AS 
  /*execute_system是实现运行os命令的函数*/ 
  FUNCTION execute_system(command VARCHAR2, 
  timeout NUMBER DEFAULT 10) 
  RETURN NUMBER IS 

  status NUMBER;
  result VARCHAR2(20);
  command_code NUMBER;
  pipe_name VARCHAR2(30);
  BEGIN 
  pipe_name := DBMS_PIPE.UNIQUE_SESSION_NAME;
  DBMS_PIPE.PACK_MESSAGE('SYSTEM');
  DBMS_PIPE.PACK_MESSAGE(pipe_name);
  DBMS_PIPE.PACK_MESSAGE(command);
  /*向daemon管道发送表示命令的字符*/ 
  status := DBMS_PIPE.SEND_MESSAGE('daemon', timeout);
  IF status 0 THEN 
  RAISE_APPLICATION_ERROR(-20010, 
  'Execute_system: Error while sending. Status = ' || status);
  END IF;status := DBMS_PIPE.RECEIVE_MESSAGE(pipe_name, timeout);
  IF status 0 THEN 
  RAISE_APPLICATION_ERROR(-20011, 
  'Execute_system: Error while receiving. 
  Status = ' || status);
  END IF;
  /*获取返回结果*/ 
  DBMS_PIPE.UNPACK_MESSAGE(result);
  IF result 'done' THEN 
  RAISE_APPLICATION_ERROR(-20012, 
  'Execute_system: Done not received.');
  END IF;

  DBMS_PIPE.UNPACK_MESSAGE(command_code);
  DBMS_OUTPUT.PUT_LINE('System command executed. result = ' || 
  command_code);
  RETURN command_code;
  END execute_system;
  /*stop是让daemon停止*/ 
  PROCEDURE stop(timeout NUMBER DEFAULT 10) IS 
  status NUMBER;
  BEGIN 
  DBMS_PIPE.PACK_MESSAGE('STOP');
  status := DBMS_PIPE.SEND_MESSAGE('daemon', timeout);
  IF status 0 THEN 
  RAISE_APPLICATION_ERROR(-20030, 
  'stop: error while sending. status = ' || status);
  END IF;
  END stop;
  END daemon;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  通过Sql*Plus运行以上语句,将为当前用户创建daemon程序包。 

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  2、创建在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 command;
  VARCHAR value[2000];
  VARCHAR return_name[30];
  EXEC SQL END DECLARE SECTION;

  void 
  connect_error() 
  { 
  char msg_buffer[512];
  int msg_length;
  int buffer_size = 512;


<

展开更多 50%)
分享

猜你喜欢

Oracle如何直接运行OS命令(上)

编程语言 网络编程
Oracle如何直接运行OS命令(上)

Oracle中如何直接运行OS命令(上)

电脑网络
Oracle中如何直接运行OS命令(上)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Oracle如何直接运行OS命令(下)

编程语言 网络编程
Oracle如何直接运行OS命令(下)

Oracle中如何直接运行OS命令(下)

电脑网络
Oracle中如何直接运行OS命令(下)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何实现禁止USB接口直接运行

电脑入门
如何实现禁止USB接口直接运行

如何直接在浏览器内运行SQL命令

Java JAVA基础
如何直接在浏览器内运行SQL命令

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

再美也是昙花一现 - QQ情侣分组

再美也是昙花一现 - QQ情侣分组

图片预载入

图片预载入
下拉加载更多内容 ↓