| 
                         正在看的ORACLE教程是:Oracle如何直接运行OS命令(下)。  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    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的文档。 <                        (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |