Oracle: 甲 App 新增一筆資料時, 乙 App 可馬上得知嗎? |
答題得分者是:Mickey
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=24940 可不可行...Mickey 前輩您好: 先謝謝您的回答。 :-) 小弟看了您提供的解答中如下的一句: "以 DB Server 為 Client, DB Client 為 Server, 當 DB server 確認完成 DML(Insert/Update/Delete)時, 發起請求 DB Client 執行 DataSet Re-Open 動作" 想問的是 DB Server 發起請求 DB Client 執行動作 這個請求動作是應該由某 App 發起嗎? 我想 Mickey 前輩的意思是甲 App 在新增資料至 Oracle 後 由甲 App發訊息給乙 App, 然後乙 App 執行 DataSet Re-Open 的動作。 小弟現在的問題是能在不更改甲 App 的情況下 而當甲 App 將資料新增至 Oracle 後 乙 App 能馬上得知, 且乙 App 不是隨時去檢查 DataSet 是否有異動 這情況下可能做到嗎?謝謝指教。 -- 將進酒 杯莫停 與君歌一曲 請君為我傾耳聽 |
amide
一般會員 發表:4 回覆:13 積分:13 註冊:2002-07-11 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 那請問一下, Oracle 的 Trigger 中 可以呼叫外部程式或傳送訊息給外部程式?1.據我所知, Oracle 沒有直接這樣做的機制, 但 Oracle 又提供一個很有趣的 package "DBMS_PIPE" 去執行 command shell, 以下是一段 Sample PL/SQL , 我沒驗證過,不知能不能 work. CREATE OR REPLACE 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); 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;2.MSSQL 可藉由 Extend Store Procedure 呼叫外部程式 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23854 引言: 現在的問題是能在不更改甲 App 的情況下 而當甲 App 將資料新增至 Oracle 後 乙 App 能馬上得知, 且乙 App 不是隨時去檢查 DataSet 是否有異動 這情況下可能做到嗎?甲 App 不動的情況下, 沒有法度了 ! 或許從 Database Open Client Net Library 進手可能還有希望, 不過困難度似乎很高. 不要稱我為前輩,我會歹勢 /* 使用中文很辛苦,中華男兒當自強 */ 發表人 - |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 再請教一下大家 Oracle 的內建套裝程式(Built-in Packages) 是買 Oracle 的時候就有, 還是要另外買呢? 謝謝!有 ! Oracle 算是滿大方的. 好像是灌 Oracle SQL Server 才有. %ORACLEHOME%/rdbms/admin/ 下, 不是所有的 Package , 在 Install 時都會 Create, 且有一部份是經過 Oracle PL/SQL Warpper Utility encode 的 plb file. 我想,有一些 Package 是為了要給 OEM (Oracle Enterprise Manager) 用的, 不是給一般 Developer 使用. /* 使用中文很辛苦,中華男兒當自強 */ |
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
引言:引言: 那請問一下, Oracle 的 Trigger 中 可以呼叫外部程式或傳送訊息給外部程式?1.據我所知, Oracle 沒有直接這樣做的機制, 但 Oracle 又提供一個很有趣的 package "DBMS_PIPE" 去執行 command shell, 以下是一段 Sample PL/SQL , 我沒驗證過,不知能不能 work.CREATE OR REPLACE 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); 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;2.MSSQL 可藉由 Extend Store Procedure 呼叫外部程式 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23854引言: 現在的問題是能在不更改甲 App 的情況下 而當甲 App 將資料新增至 Oracle 後 乙 App 能馬上得知, 且乙 App 不是隨時去檢查 DataSet 是否有異動 這情況下可能做到嗎?甲 App 不動的情況下, 沒有法度了 ! 或許從 Database Open Client Net Library 進手可能還有希望, 不過困難度似乎很高. 不要稱我為前輩,我會歹勢 /* 使用中文很辛苦,中華男兒當自強 */ 發表人 - >>< face="Verdana, Arial, Helvetica"> oracle call 外部dll,so檔範例 http://www.orafaq.org/scripts/c_src/extproc.txt /*-------------------------------------------------------------------- * extproc.c * * Call operating system commands from PL/SQL using the External * Procedure Interface. * * Frank Naude - Dec 2000 *-------------------------------------------------------------------- * Setup instructions: * * 1. Compile this program: cc -G extproc.c -o extproc.so (on Unix) * 2. Run $ORACLE_HOME/bin/extproc to ensure it is executable * 3. Define this TNSNAMES.ORA entry (Use the correct domain): * EXTPROC_CONNECTION_DATA.WORLD = (DESCRIPTION = * (ADDRESS=(PROTOCOL=IPC)(KEY=extproc)) * (CONNECT_DATA=(SID=extproc))) * 4. Define this LISTENER.ORA entry: * EXTERNAL_PROCEDURE_LISTENER = * (ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=extproc))) * SID_LIST_EXTERNAL_PROCEDURE_LISTENER = * (SID_LIST=(SID_DESC=(SID_NAME=extproc) * (ORACLE_HOME=/app/oracle/product.8.1.7)(PROGRAM=extproc))) * 5. Start the new listener: lsnrctl start EXTERNAL_PROCEDURE_LISTENER * 6. SQL> create library shell_lib as '/app/oracle/local/extproc.so'; * / * 7. SQL> create or replace function sysrun (syscomm in varchar2) * return binary_integer * as language C -- Use "as external" for older Oracle releases * name "sysrun" * library shell_lib * parameters(syscomm string); * / * 8. Execute an OS command from PL/SQL: * PL/SQL> declare * rc number; * begin * rc := sysrun('/bin/ls -l'); * dbms_output.put_line('Return Code='||rc); * end; * / * *-------------------------------------------------------------------- * Notes: * * 1. When running shell-scripts, very few environment variables will be * defined (as with cron jobs). Remember to set everything * explicitly. Ie. $PATH, etc. * 2. Rewrite this program using C Piping if you need to capture command * output. Look at the popen (pipe open) function. * 3. In addition to this, you can also try to make the external * procedure example as provided by Oracle: * $ cd $ORACLE_HOME/plsql/demo * $ make -f demo_plsql.mk extproc.so * *-------------------------------------------------------------------- */ int sysrun(char *command) { return system(command); }
------
星期一,二...無窮迴圈@@ |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |