在資料庫中自定義外部函式
在oracle中可以使用pl/sql來實現一些複雜的功能,同時可以透過自定義的外部函式來實現很多豐富的功能,我們可以基於c/c++來寫一些函式,然後把動態連結庫放入ORACLE_HOME中方便直接呼叫。
首先這種實現方法需要依賴於資料庫層面的服務extproc,監聽器會生成一個extproc程式,然後專門來處理外部函式的呼叫。
具體的配置可以在$ORACLE_HOME/network/admin下的listener.ora和tnsnames.ora中體現。
一般透過dbca建立的庫都會預設配置extproc的部分,可以看到它使用的是ipc協議而不是tcp協議。
樣例如下:
listener.ora
LIST=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=1599))
(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))
SID_LIST_LIST=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=TEST01)
(ORACLE_HOME=/u03/ora11g/product/11.2.0/dbhome_1)
(SID_NAME=TEST01)))
tnsnames.ora
EXTPROC01=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=ipc)(key=extproc))
(CONNECT_DATA=(SERVICE_NAME=TEST01))
)
如果配置沒有問題,可以使用tnsping來驗證一下服務是否可用。
[ora11g@rac1 admin]$ tnsping extproc01
TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 24-FEB-2015 06:03:53
Copyright (c) 1997, 2011, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=ipc)(key=extproc)) (CONNECT_DATA=(SERVICE_NAME=TEST01)))
OK (0 msec)
接下來我們來實現一個簡單的函式,大過年的我們就以紅包為例。我們傳入紅包的金額,直接放大100倍。比如傳入8塊,直接輸出800.
cat test.c
test(n)
int n;
{
int lucky_money;
lucky_money=100*n;
return (lucky_money);
}
對編寫的c程式做編譯,生成動態連結庫檔案,然後直接複製到$ORACLE_HOME/bin下
[ora11g@rac1 extproc]$ cc -shared -o test.so test.c
[ora11g@rac1 extproc]$ ll
total 12
-rw-r--r-- 1 ora11g dba 83 Feb 24 05:42 test.c
-rwxr-xr-x 1 ora11g dba 5609 Feb 24 05:42 test.so
[ora11g@rac1 extproc]$ cp test.so $ORACLE_HOME/bin
這個時候我們就開始建立庫檔案,指向test.so,然後把許可權賦予指定的使用者。
SQL> create or replace library test_code as '$ORACLE_HOME/bin/test.so';
/
Library created.
SQL> grant execute on test_code to n1;
Grant succeeded.
有了庫檔案,我們就開始定義函式,這個函式最終給會呼叫連結庫檔案
create or replace function func_test
(x binary_integer)
return binary_integer
as language C
library sys.test_code
name "test";
/
到此為止就大功告成了,我們的函式就建立成功了,來簡單驗證一下。
set serveroutput on
var lucky_money number;
var amount number;
exec :lucky_money :=8888;
exec :amount := func_test(8888);
print amount;
SQL>
AMOUNT
----------
888800
這種方式能夠遮蔽程式碼層的抽象,直接開放豐富的功能,還是比較實用的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1440699/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Clickhouse 使用者自定義外部函式函式
- Hive中自定義函式Hive函式
- Spring Boot中使用JPA呼叫自定義的資料庫函式Spring Boot資料庫函式
- Mysql資料庫自定義函式的定義、使用方法及操作注意事項MySql資料庫函式
- Oracle 自定義函式Oracle函式
- shell自定義函式函式
- Oracle資料庫中convert()函式,在瀚高資料庫中如何替換使用?Oracle資料庫函式
- MySQL資料庫中timediff()函式,在瀚高資料庫中如何替換使用?MySql資料庫函式
- sql中select列有自定義函式 dblinkSQL函式
- Hive常用函式及自定義函式Hive函式
- 為Vertica資料庫增加自定義函式to_base64和from_base64資料庫函式
- 在python中使用sqlite的自定義函式功能PythonSQLite函式
- hive 3.0.0自定義函式Hive函式
- python教程:自定義函式Python函式
- 影片直播系統原始碼,在Laravel中自定義模板函式 並在模板中呼叫原始碼Laravel函式
- java自定義equals函式和hashCode函式Java函式
- 編號函式 自定義函式 集合型別 表的優化 資料傾斜函式型別優化
- PHP 自定義函式用法及常用函式集合PHP函式
- Android圖解建立外部lib庫及自定義ViewAndroid圖解View
- Hive函式(內建函式+自定義標準函式UDF)Hive函式
- Laravel 新增自定義助手函式Laravel函式
- laravel 自定義全域性函式Laravel函式
- Laravel 自定義函式存放位置Laravel函式
- Laravel自定義輔助函式Laravel函式
- FlinkSQL自定義函式開發SQL函式
- apiAutoTest:支援自定義函式,用例中可呼叫API函式
- 自定義註解完成資料庫切庫資料庫
- MySQL使用之五_自定義函式和自定義過程MySql函式
- JavaScript 設計模式系列 – 自定義函式(惰性函式)JavaScript設計模式函式
- Ignite自定義函式注意事項函式
- VBA 自定義常用函式 (備用)函式
- php自定義函式放哪兒PHP函式
- matlab自定義函式建立與使用Matlab函式
- MySQL全面瓦解18:自定義函式MySql函式
- vue 在methods中定義的函式 not definedVue函式
- 關於變數的宣告和定義、內部函式和外部函式變數函式
- MySQL資料庫中的分組函式ROLLUPMySql資料庫函式
- 自主資料型別:在TVM中啟用自定義資料型別探索資料型別
- 如何在函式計算內部中自定義DNS解析函式DNS