前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在数据库中自定义外部函数(r4笔记第56天)

在数据库中自定义外部函数(r4笔记第56天)

作者头像
jeanron100
发布2018-03-15 15:52:41
5740
发布2018-03-15 15:52:41
举报

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

如果配置没有问题,可以使用tnsping来验证一下服务是否可用。 [ora11g@rac1 admin]$ tnsping extproc01 TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 24-FEB-2015 06:03:53 Copyright (c) 1997, 2011, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=ipc)(key=extproc)) (CONNECT_DATA=(SERVICE_NAME=TEST01))) OK (0 msec) 接下来我们来实现一个简单的函数,大过年的我们就以红包为例。我们传入红包的金额,直接放大100倍。比如传入8块,直接输出800.

cat test.c test(n) int n; { int lucky_money; lucky_money=100*n; return (lucky_money); }

对编写的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 这种方式能够屏蔽代码层的抽象,直接开放丰富的功能,还是比较实用的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档