程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Oracle 中調用外部C動態庫函數

Oracle 中調用外部C動態庫函數

編輯:關於PHP編程

Oracle 中調用外部C動態庫函數


由於項目為了縮短開發時間,要在Oracle中調用外部已經開發好的C程序。
查找了網上的一些帖子,再結合實際總結這篇文章。希望對大家有所幫助。
參考文章:http://www.cnblogs.com/mathitlin99/archive/2013/09/05/3303717.html

首先編譯外部動態庫libDialPlan.so
  1. gcc -fPIC -c LibDialPlan.cpp
  2. gcc -shared -o libDialPlan.so LibDialPlan.o -lstdc++

修改Oracle TNS文件和監聽文件。
不清楚大家直接拷貝是否可用。如果有問題,請注意一下等號以及括號兩邊的空格。
tnsnames.ora

  1. ORADB =
  2. (DESCRIPTION =
  3. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.69.166)(PORT = 1521))
  4. (CONNECT_DATA =
  5. (SERVER = DEDICATED)
  6. (SERVICE_NAME = oradb)
  7. )
  8. )

  9. EXTPROC_CONNECTION_DATA=
  10. (DESCRIPTION=
  11. (ADDRESS_LIST=
  12. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  13. )
  14. (CONNECT_DATA=
  15. (SID = PLSExtProc)
  16. (PRESENTATION = RO)
  17. )
  18. )
listener.ora
  1. LISTENER =
  2. (DESCRIPTION_LIST =
  3. (DESCRIPTION =
  4. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  5. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.69.166)(PORT = 1521))
  6. )
  7. )

  8. ADR_BASE_LISTENER = /home/oracle/db/app


  9. SID_LIST_LISTENER =
  10. (SID_LIST =
  11. (SID_DESC =
  12. (GLOBAL_DBNAME = oradb)
  13. (SID_NAME = oradb)
  14. )
  15. (SID_DESC=
  16. (SID_NAME = PLSExtProc)
  17. (ORACLE_HOME = /opt/local/oracle/app/product/11.2.0/dbhome_2)
  18. (ENVS = EXTPROC_DLLS=ANY)
  19. (PROGRAM = extproc)
  20. )
  21. )

修改後重啟監聽:lsnrctl stop ;lsnrctl start
查看監聽狀態,應該出現如下的監聽項:PLSExtProc
  1. [root@localhost admin]# lsnrctl status

  2. LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 04-AUG-2016 19:33:50

  3. Copyright (c) 1991, 2009, Oracle. All rights reserved.

  4. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
  5. STATUS of the LISTENER
  6. ------------------------
  7. Alias LISTENER
  8. Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
  9. Start Date 04-AUG-2016 16:23:54
  10. Uptime 0 days 3 hr. 9 min. 55 sec
  11. Trace Level off
  12. Security ON: Local OS Authentication
  13. SNMP OFF
  14. Listener Parameter File /opt/local/oracle/app/product/11.2.0/dbhome_2/network/admin/listener.ora
  15. Listener Log File /opt/local/oracle/app/product/11.2.0/dbhome_2/network/log/listener.log
  16. Listening Endpoints Summary...
  17. (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  18. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.69.166)(PORT=1521)))
  19. Services Summary...
  20. Service "PLSExtProc" has 1 instance(s).
  21. Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
  22. Service "oradb" has 1 instance(s).
  23. Instance "oradb", status UNKNOWN, has 1 handler(s) for this service...
  24. The command completed successfully
  25. [root@localhost admin]#
創建Oraclelibrary 對象
  1. create or replace library hytpdtbilldb.Fun_Ext_Proc
  2. as '/opt/local/Oracle_install/Oracle_Call_External_C/libDialPlan.so';
創建函數
1)按照網上的文章,還有一個parameter的參數。
但是我加入這個參數後一直不能編譯通過。去掉後並未影響函數的使用。
2)數字和字符串對應的是binary_integer,varchar2類型。本來C的入參是需要數組類型,但是Oracle沒有真正的數組,只能通過字符串代替。
3)在我測試的過程中,偶爾需要重啟才能正常調用函數。大家使用的過程中可以留意一下。
  1. create or replace function hytpdtbilldb.Air2Gsi
  2. (x binary_integer,y varchar2)
  3. return varchar2
  4. as
  5. language C
  6. library hytpdtbilldb.Fun_Ext_Proc
  7. name "Air2Gsi";
  8. /


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved