oracle 11g 调用动态链接库例子

首先,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;
原文地址:https://www.cnblogs.com/liuzhuan23/p/12888430.html