在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))
) cat test.c
test(n)
int n;
對編寫的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
這種方式能夠遮蔽**層的抽象,直接開放豐富的功能,還是比較實用的。
SQLserver 資料庫自定義函式
最近專案開發上使用的sqlserver資料庫是2008版本,由於08版本的資料是沒有字串合併 string agg 這個函式 2017版本及以上支援 的,只有用stuff for xml path 來達到效果。所以才有萌生出了自定義聚合函式的想法。第一步新建專案 2008版本選擇 檔案 新建 專案 ...
自定義mysql資料庫函式 資料庫自定義函式
這個為通用過濾關鍵字的函式,若有其他關鍵字未新增可以參考語法加入。use db go object userdefinedfunction dbo f filterstring script date 12 09 2013 17 03 45 set ansi nulls on go set quot...
資料庫中的自定義錶值函式
看到別人寫的函式,一開始看不懂,於是在網上找資料,原來是錶值函式,感覺又學到了,滿滿的充實感,摘錄如下 錶值函式 錶值函式和標量值函式的不同是 錶值函式是返回乙個table型別 table型別相當與一張儲存在記憶體中的一張虛擬表.錶值函式的語法 create function schema name...