Oracle中如何直接運行OS命令(下)
發表于:2007-07-13來源:作者:點擊數:
標簽:
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(1); } void sql_e
|
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(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("%.*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 (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] = '\0'; /*如果是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] = '\0'; 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; |
[page]
|
IF (status) { printf ?。?Daemon error while responding to system command."); printf(" status: %d\n", status); } } ELSE { printf ?。?Daemon error: invalid command '%s' received.\n", command.arr); } } ELSE { printf("Daemon error while waiting for signal."); printf(" status = %d\n", 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
4、在sqlplus運行測試語句:
SQL> variable rv number SQL> execute :rv := DAEMON.EXECUTE_SYSTEM('ls -la'); PL/SQL 過程已成功完成。 SQL> execute :rv := DAEMON.EXECUTE_SYSTEM('dir'); PL/SQL 過程已成功完成。 SQL>
DBMS_PIPE的用法見oracle的文檔。 |
原文轉自:http://www.kjueaiud.com