在資料庫中自定義外部函式

2021-09-22 18:57:35 字數 1991 閱讀 1547

在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...