首先,oracle内需要一个用户用来被授权使用动态链接库,这里用案例设定一个函数授权账户'drp'
sqlplus /nolog
conn sys as sysdba
Create user drp identified by drp;
Create tablespace TS_DRP datafile 'TS_DRP*data.dbf' size 500m;
alter user drp default tablespace TS_DRP;
GRANT connect, resource TO drp;
grant Create session, Create table,Create view,unlimited tablespace to drp;
如果你已经具备其他用户, 上述步骤可以忽略,并将调用声明用户改为你自己的用户名
用来测试的C代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int andy_upper(char *istr, char *ostr){
int i = 0;
while(istr[i]){
ostr[i] = toupper(istr[i]);
i++;
}
return 0;
}
编译为so
gcc -fPIC -shared -o andy_lib.so andy_lib.c
安装部署so库
cp andy_lib.so $ORACLE_HOME/bin/
sqlplus /nolog
SQL> conn sys as sysdba
SQL> CREATE OR REPLACE LIBRARY andy_lib AS '$ORACLE_HOME/bin/andy_lib.so'; # 先建立so的别名
/
SQL> grant execute on andy_lib to drp; # 授权给drp
用drp用户登陆创建一个调用声明
conn drp/drp or use sqldeveloper-3
SQL> conn drp/drp
SQL> create or replace function andy_lib_upper(p_istr in varchar2, p_ostr out varchar2)
return binary_integer as language C library sys.andy_lib name "andy_upper" parameters (p_istr string, p_ostr string);
/
看到 Function created. 就表示建立成功了
到了这里,用户drp已经可以使用函数andy_lib_upper了,他被指向到别名sys.andy_lib下的函数andy_upper,第一个参数是in,第二个参数用来出参out
测试代码
set serveroutput on size 9999
declare
res binary_integer;
v_in CHAR(100);
v_out CHAR(100);
begin
v_in := 'hello world';
res := andy_lib_upper(v_in, v_out);
dbms_output.put_line(res);
dbms_output.put_line(v_in);
dbms_output.put_line(v_out);
end;
/
增进使用方法
andy_lib_upper函数第一个是in入参,第二个是out出参,每次使用都需要提前预定义一个变量做out, 这在使用起来不是很方便,可以再定义一个其它函数,把andy_lib_upper包起来
create or replace function fun333(p1 in varchar2)
return varchar2
as
v_in varchar2(4000);
v_out varchar2(4000);
v_n number;
begin
v_in := p1;
v_n := andy_lib_upper(v_in, v_out);
return v_out;
end;
/
测试增进方法
SQL> select fun333('helllo wooold') from dual;