国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

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

2024-08-29 13:42:01
字體:
來源:轉載
供稿:網友
  在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;   通過Sql*Plus運行以上語句,將為當前用戶創建daemon程序包。    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[20];
  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;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汽车| 明光市| 常宁市| 唐河县| 云阳县| 漯河市| 石柱| 乌拉特中旗| 罗江县| 天津市| 宝清县| 白沙| 宁陵县| 大姚县| 顺昌县| 德格县| 余庆县| 元江| 林州市| 绥德县| 郯城县| 曲周县| 探索| 大方县| 杭锦后旗| 滨州市| 长沙市| 宽城| 荆州市| 忻城县| 邯郸市| 安顺市| 恩平市| 都昌县| 清流县| 合江县| 宾川县| 辉县市| 淮阳县| 昌黎县| 长子县|