線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3043
推到 Plurk!
推到 Facebook!

Oracle: 甲 App 新增一筆資料時, 乙 App 可馬上得知嗎?

答題得分者是:Mickey
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-27 20:41:50 IP:202.39.xxx.xxx 未訂閱
各位先進安好: 甲 App 會不定時於 Oracle 資料庫中新增資料 那乙 App 可於甲 App 新增資料後立即得知 並且知道甲 App 新增了哪一筆嗎? 也就是 Oracle 有辦法通知乙 App 有資料新增了? 因前提是不要更改甲 App 雖知道有 trigger, 但不太符合需求 因為資料量大, 常去 Select 的話, 又太操 Oracle 如果有辦法的話, 大概要怎麼做呢? 謝謝大家。 -- 將進酒 杯莫停 與君歌一曲 請君為我傾耳聽
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-28 08:38:24 IP:61.219.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=24940 可不可行... /* 使用中文很辛苦,中華男兒當自強 */
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-28 09:33:41 IP:202.39.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-28 09:54:39 IP:211.22.xxx.xxx 未訂閱
我覺得應該使用Trigger是比較好的方式.當資料庫有異動時就會觸動Trigger, 再從這邊去呼叫乙App就可以了.
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-28 10:15:47 IP:202.39.xxx.xxx 未訂閱
引言: 我覺得應該使用Trigger是比較好的方式.當資料庫有異動時就會觸動Trigger, 再從這邊去呼叫乙App就可以了.
謝謝您! 那請問一下, Oracle 的 Trigger 中 可以呼叫外部程式或傳送訊息給外部程式? -- 將進酒 杯莫停 與君歌一曲 請君為我傾耳聽
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-01-28 16:44:36 IP:61.219.xxx.xxx 未訂閱
引言: 那請問一下, 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-01-28 17:40:55 IP:202.39.xxx.xxx 未訂閱
感謝 Mickey 兄的指引, 看來又是一大課題, 小弟再研究。 :-) -- 將進酒 杯莫停 與君歌一曲 請君為我傾耳聽
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-01-28 22:01:49 IP:202.39.xxx.xxx 未訂閱
再請教一下大家 Oracle 的內建套裝程式(Built-in Packages) 是買 Oracle 的時候就有, 還是要另外買呢? 謝謝! -- 將進酒 杯莫停 與君歌一曲 請君為我傾耳聽
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-01-29 08:41:00 IP:61.219.xxx.xxx 未訂閱
引言: 再請教一下大家 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-01-29 21:54:57 IP:61.59.xxx.xxx 未訂閱
引言:
引言: 那請問一下, 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-01-30 08:23:33 IP:163.29.xxx.xxx 未訂閱
感謝 pgdennis 兄, 不知有沒有 for Linux / Windows 範例 ? /* 使用中文很辛苦,中華男兒當自強 */
系統時間:2024-04-25 8:20:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!