熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

外部程序使一切變得簡單

2013-11-13 15:47:30  來源: Oracle 

  外部程序其實是儲存在DLL或是共享庫中的二進制程序並且可以通過PL/SQL聲明從存儲程序中訪問得到它這既使得它們成為了存儲程序開發者們最強大的開發工具之一
  
  但是事實上人們很少使用這些外部程序也許是因為人們覺得創建DLL和共享庫安裝程序以及引用PL/SQL這一系列過程讓人覺得非常繁瑣而對應的文檔並不能起到什麼幫助作用因為這些文檔提供的都是一些深奧的例子它描述了使用的變量以及子程序使問題變得更加令人費解
  
  你可以在許多不同的程序編譯語言中來創建DLL以及共享庫你也可通過轉化腳本語言為二進制代碼來實現DLL以及共享庫的創建DLL與共享庫作為獨立與操作系統的一部分其實就是像調用執行文件的一部分那樣被連接和調用的具有公共入口的二進制映像這裡有一個用C描述的用於二進制處理的DLL
  
  /* bitopc */
  #ifdef WIN
  #define DLLEXP __declspec(dllexport)
  #else
  #define DLLEXP
  #endif /* WIN */
  DLLEXP int bitand(int rint l) { return r & l; }
  DLLEXP int bitor(int rint l) { return r | l; }
  DLLEXP int bitxor(int rint l) { return r ^ l; }
  DLLEXP int bitshr(int nint s) { return n << s; }
  DLLEXP int bitshl(int nint s) { return n >> s; }
  DLLEXP int bitset(int nint b) { return n | (<<b); }
  DLLEXP int bitclr(int nint b) { return n ^ (<<b); }
  DLLEXP int bittst(int nint b) { return (n & (<<b)) ? : ; }
  
  其中唯一超出標准C范圍的就是DLLEXP宏他為Windows提供了這些函數名並且可能被UNIX所忽視將這些資源代碼與你的編譯文檔相對照從而你可以從中了解更多關於如何創建DLL的信息在UNIX環境下使用GNU編譯器的話則包括以下命令行
  
  GNU C/C++: cc shared o libbitopso bitopc
  
  從數據庫中調用DLL和共享庫的下一步就是使用CREATE LIBRARY命令並給出完整的路徑例如
  
  CREATE OR REPLACE LIBRARY SCOTTbitop AS /home/scott/bitop/libbitopso
  
  通常只有DBA賬號擁有執行這個命令的權限但此命令可通過其他用戶的行為發出
  
  然後這個用戶能調用PL/SQL和外部程序來調用任何DLL和共享庫代碼如下
  
  create or replace package bit_op
  as
    function bit_and(l pls_integerr pls_integer) return pls_integer
    as language c name bitand library bitop;
    
    function bit_or(r pls_integerl pls_integer) return pls_integer
    as language c name bitor library bitop;
    
    function bit_xor(r pls_integerl pls_integer) return pls_integer
    as language c name bitxor library bitop;
    
    function bit_shr(n pls_integers pls_integer) return pls_integer
    as language c name bitshr library bitop;
    
    function bit_shl(n pls_integers pls_integer) return pls_integer
    as language c name bitshl library bitop;
    
    function bit_set(n pls_integerb pls_integer) return pls_integer
    as language c name bitset library bitop;
    
    function bit_clr(n pls_integerb pls_integer) return pls_integer
    as language c name bitclr library bitop;
    
    function bit_tst(n pls_integerb pls_integer) return pls_integer
    as language c name bittst library bitop;
  end bit_op;
  
  /
  
  注意這個過程不需要程序包如果數據庫已經設立好可以接受通過監聽器發出的外部程序請求那麼這個過程就完成了然後你就可以使用以下的查詢命令
  
  select bit_opbit_and() from dual where bit_opbit_tst() = ;
  
  如果你沒有建立好數據庫來接收外部指令請求那麼你必須配置其他的監聽器來完成內部聯接
  
  外部程序請求將通過SQL*Net發送給專門的監聽服務再Oraclei中許多這種過程都是手工處理的而在Oraclei中大部分可以通過設置完成了
  
  即設在你的數據庫中存在tnsnamesora這樣一個文件你要確保你有能告訴客戶端怎樣聯接到數據庫並發出外部請求的設置設置如下
  
  EXTPROC_CONNECTION_DATAworld =
   (DESCRIPTION=
    (ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_KEY))
    (CONNECT_DATA=(SID=EXTPROC_AGENT))
   )
  
  請注意EXTPROC_CONNECTION_DATA這個名字是強制不變的world則需要設置為與你的數據庫具有相同的域同時EXTPROC_KEY和EXTPROC_AGENT則必須與你的listenerora文件中的設置相匹配其中listenerora文件設置如下
  
  EXTERNAL_PROCEDURE_LISTENER =
   (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL=IPC)(KEY=EXTPROC_KEY))
   )
  
  SID_LIST_EXTERNAL_PROCEDURE_LISTENER =
   (SID_LIST =
    (SID_DESC =
     (SID_NAME=EXTPROC_AGENT)
     (ORACLE_HOME = c:\oracle\ora)
     (PROGRAM = EXTPROC)
    )
   )
  
  在Oraclei數據庫中EXTPROC_CONNECTION_DATA應該已經被定義用於連接PLSExtProc並且能在你自己的外部請求中使用但是任何沒有在監聽方的環境變量EXTPROC_DLL 中明確指出的DLLOraclei都拒絕了對其的訪問權從而增加了一些附加安全定義在外部過程中這個變量需要使用SID_DESC中的ENV參數具體代碼如下
  
  SID_LIST_LISTENER =
   (SID_LIST =
    (SID_DESC =
     (SID_NAME = PLSExtProc)
     (ORACLE_HOME = /u/app/oracle/product/)
     (PROGRAM = extproc)
     (ENVS=EXTPROC_DLLS=ANY)
    )
    (SID_DESC =
     (GLOBAL_DBNAME = )
     (ORACLE_HOME = /u/app/oracle/product/)
     (SID_NAME = ikan)
    )
   )
  
  為了得到更好的安全性變量EXTPROC_DLLS可以設置為DLL序列或是共享庫序列也可以設為ANY從而與敘訪問任何DLL和共享庫你可以通過一下這條命令手工的進行連接測試
From:http://tw.wingwit.com/Article/program/Oracle/201311/17309.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.