为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

如何在plsql里调用C语言写的程序

2011-09-19 4页 doc 80KB 40阅读

用户头像

is_703464

暂无简介

举报
如何在plsql里调用C语言写的程序有时,我们会发现有些功能通过PL/SQL完成会很麻烦,而通过C/C++语言编程则会容易很多。因此,oracle提供了在PL/SQL程序里直接调用外部函数(包括C函数或Java方法)的功能,从而扩展了PL/SQL的程序功能。调用外部函数的过程如下图所示。 HYPERLINK "http://space.itpub.net/batch.download.php?aid=5978" \t "_blank" 调用外部函数的过程 从上图可以看出,调用外部函数的过程包括: 1)       用户进程执行PL/SQL程序。 2)      ...
如何在plsql里调用C语言写的程序
有时,我们会发现有些功能通过PL/SQL完成会很麻烦,而通过C/C++语言编程则会容易很多。因此,oracle提供了在PL/SQL程序里直接调用外部函数(包括C函数或Java方法)的功能,从而扩展了PL/SQL的程序功能。调用外部函数的过程如下图所示。 HYPERLINK "http://space.itpub.net/batch.download.php?aid=5978" \t "_blank" 调用外部函数的过程 从上图可以看出,调用外部函数的过程包括: 1)       用户进程执行PL/SQL程序。 2)       在执行的PL/SQL程序过程中,调用了一个C/C++语言写的函数:c_func。这里需要借助别名库(Alias Library)。别名库是数据库里的一个对象,用来描述一个外部函数所在的动态链接库的路径和名称。通过别名库,从而可以知道被调用的外部函数在哪个文件里。 3)       PL/SQL将对外部函数的调用请求发送给监听器。 4)       监听器生成一个extproc进程,该进程专门用来处理对外部函数的调用。每个session都会生成一个属于该session的extproc进程,并且在整个session生命周期里,extproc进程会一直存在。 5)       Extproc进程负责将别名库所指定的动态链接库文件加载到内存。 6)       Extproc进程执行指定的外部函数,并将结果返回给服务器进程,进而返回给用户进程。 需要对监听器进行配置,从而启动extproc进程,配置方式如前面的图11-3所示。其中(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))说明监听extproc进程请求的地址;而SID_DESC部分则说明extproc进程的连接信息。       然后我们还要配置tnsnames.ora文件,注意,该文件也必须位于数据库服务器端。我们需要添加如下图的内容。 配置tnsnames.ora       配置完毕以后,可以尝试tnsping连接字符串名称,如果成功,则说明监听没有问题。 [oracle@book admin]$ tnsping EXTPROC_CONNECTION_DATA       接下来,我们创建一个C语言编写的函数,如下所示。该函数完成的功能非常简单,计算传入参数的15%,并作为税额返回给调用者。 [oracle@book ~]$ vi calc_tax.c calc_tax(n) int n; {        int tax;        tax=(n*15)/100;        return (tax); }       将calc_tax.c文件编译成动态链接库,并将生成的库文件拷贝到$ORACLE_HOME/bin目录下: [oracle@book ~]$ cc -shared -o calc_tax.so calc_tax.c [oracle@book ~]$ cp calc_tax.so $ORACLE_HOME/bin       然后,我们创建一个别名库,用来说明将要调用的C函数所在的库文件,并将使用c_code别名库的权限赋给HR用户: SQL> connect / as sysdba SQL> create or replace library c_code as '$ORACLE_HOME/bin/calc_tax.so';  2 / SQL> grant execute on c_code to hr;       要使用这个calc_tax函数,还必须在数据库里创建一个调用声明。如下所示: SQL> connect hr/hr SQL> create or replace function call_c  2 (x binary_integer)  3 return binary_integer  4 as language C  5 library sys.c_code  6 name "calc_tax";  7 /       在调用声明里定义了calc_tax函数的传入传出参数、所在的别名库名称(library sys.c_code部分)、以及在动态链接库中的函数名(name "calc_tax")等。       现在,我们就可以通过调用call_c,进而调用calc_tax函数了。如下所示: SQL> set serveroutput on SQL> var v_salary number; SQL> var v_tax number; SQL> exec :v_salary := 10000; SQL> exec :v_tax := call_c(:v_salary); SQL> print v_tax;     V_TAX -----------------       1500       从返回结果可以看到,我们成功调用了C函数:calc_tax。 注:以上内容摘自《Oracle数据库核心技术与实务详解-教你如何成为10g OCP》一书。
/
本文档为【如何在plsql里调用C语言写的程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索