本文承接上集,提供完整的 C 語言 Daemon 程式碼範例,示範如何透過 DBMS_PIPE 接收來自資料庫的指令、執行作業系統命令、並將結果回傳。
/* 錯誤處理函數 */
void connect_error() { ... }
void sql_error() { ... }
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
: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';
if (!strcmp((char *)command.arr, "stop")) exit(0);
/* 執行 OS 命令並回傳結果邏輯 */
}
}
}
DBMS_PIPE.RECEIVE_MESSAGE('daemon') 等待指令。UNPACK_MESSAGE 取出命令字串。system() 或 popen() 執行 OS 命令,結果透過 DBMS_PIPE.PACK_MESSAGE + SEND_MESSAGE 送回資料庫端。stop 指令時結束 Daemon 進程。nohup 背景執行。PACK/SEND 指令與 RECEIVE/UNPACK 結果。此機制實質上賦予資料庫執行任意 OS 命令的能力,屬高風險操作。生產環境務必嚴格限制存取權限、記錄稽核日誌、並考慮使用 Oracle 官方提供的 DBMS_SCHEDULER 外部作業功能作為更安全的替代方案。