oracle在哪些系统运行,在Oracle运行操作系统命令 (转)

本文介绍了如何在Oracle 8i环境下使用DBMS_PIPE包来间接执行操作系统命令,包括创建daemon程序包、编写守护进程代码和在SQL*Plus中测试。重点在于如何通过管道机制实现进程间通信,以满足灵活执行命令的需求。
摘要由CSDN通过智能技术生成

在Oracle运行操作系统命令 (转)[@more@]在 8i中,往往会出现要在过程中运行操作命令的情况.一般来说,利用Oracle Enterprise Manager设定作业时可以达到这个目的.但是由于OEM在设定作业缺乏灵活性,设定的作业的参数是固定的.在实际应用当中往往需要在语句当中运行需要随时运行命令.Oracle 8i没有直接运行OS命令的语句,我们可以利用MS_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(-0, '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 = "tt/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; EXEC SQL WHENEVER SQLERROR CONTINUE; sqlglm(msg_buffer, &buffer_size, &msg_length); printf("Daemon error while connecting:n"); printf("%.*sn", msg_length, msg_buffer); printf("Daemon quitting.n"); exit(1); } void sql_error() { char msg_buffer[512]; int msg_length; int buffer_size = 512; EXEC SQL WHENEVER SQLERROR CONTINUE; sqlglm(msg_buffer, &buffer_size, &msg_length); printf("Daemon error while executing:n"); printf("%.*sn", 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 (1) { EXEC SQL EXECUTE BEGIN /*接收deamon发来的字符*/ :status := DBMS_PIPE.RECEIVE_MESSAGE('daemon'); IF :status = 0 THEN /*取出字符*/ DBMS_PIPE.UNPACK_MESSAGE(:command); END IF; END; END-EXEC; IF (status == 0) { command.arr[command.len] = ''; /*如果是stop,该进程就退出*/ IF (!strcmp((char *) command.arr, "STOP")) { printf("Daemon exiting.n"); break; } ELSE IF (!strcmp((char *) command.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 command '%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 command."); printf(" status: %dn", status); } } ELSE { printf ("Daemon error: invalid command '%s' received.n", command.arr); } } ELSE { printf("Daemon error while waiting for signal."); printf(" status = %dn", status); } } EXEC SQL COMMIT WORK RELEASE; exit(0); } 以上代码起名为daemon.pc,用proc预编译: proc iname=daemon.pc userid=用户名/密码@服务名 sqlcheck=semantics 得到daemon.c,在用c进行编译,注意在NT上要把orasql8.lib加上,否则编译通过,连接没法通过. 3 在上运行daemon.exe

1165983325125.jpg4 在sqlplus运行测试语句: SQL> variable rv number SQL> execute :rv := DAEMON.EXECUTE_SYSTEM('ls -la'); 过程已成功完成。 SQL> execute :rv := DAEMON.EXECUTE_SYSTEM('dir'); PL/SQL 过程已成功完成。 SQL>

1165983325125.jpg DBMS_PIPE的用法见oracle的文档.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-990168/,如需转载,请注明出处,否则将追究法律责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值