• 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;
    
  • 相关阅读:
    Excel操作快速填充和快速分析
    Excel操作用excel实现爬取网站上表格数据
    Excel操作条件格式的使用
    Excel操作数据验证规范单元格输入
    转载:PostgreSQL 高质量学习交流网站及链接推荐
    转载:PBKDF2加密算法
    idea 离线发布项目到linux
    2022 Google Kick Start Round A
    Codeforces Round #764 (Div. 3) 题解AG
    109个shell实用脚本
  • 原文地址:https://www.cnblogs.com/liuzhuan23/p/12888430.html
Copyright © 2020-2023  润新知