Oracle 数据库的外部存储过程特性提供了在 C 语言 (或能通过 C 调用的其他语言) 中实现代码逻辑然后在数据库中通过 PLSQL 运行的功能.
概述
Oracle 数据库的外部存储过程特性提供了在 C 语言 (或能通过 C 调用的其他语言) 中实现代码逻辑然后在数据库中通过 PLSQL 运行的功能.
怎样来做?
首先, C 代码需要编译, 然后需要从它创建共享库文件 (.so) 或动态链接库 (DLL)(在使用 Windows 的情况下). 需要在数据库中创建一个 library 对象才能从 PLSQL 代码引用这个共享库文件或 DLL. 该 Library 需要通过调用规范发布, 使用特殊语法, 例如 CREATE OR REPLACE 语句的 IS|AS LANGUAGE 子句. 换言之, 这只是一个 PLSQL 封装器(也称为外部过程) 单元, 它告诉什么库需要被调用和库中的哪个函数需要运行.
Oracle 数据库提供了一个 "extproc" 代理, 来帮助 Oracle 和共享库之间的通信. 这个代理装载 library, 传递任何 (如果有的话) 参数到这个 library, 运行它并且返回结果到调用会话.
extproc 代理如何配置?
有几个方法可以配置 extproc 代理.
使用默认配置, Oracle 数据库每当调用一个外部存储过程时创建一个代理.
编辑 listener.ora 和 tnsnames.ora 来创建一个监听配置覆盖掉默认的配置. 在这种情况下, extproc 在每次调用外部存储过程时由 listener 创建.
当使用多线程 extproc agent 或使用 AGENT IN 语句来定义 library 时, 必须使用 listener 创建的代理. Oracle 数据库和 listener 创建的代理都是独立的代理. 换言之, Oracle 数据库和 listener 创建的都是独立的代理, 如果外部存储过程使用得很多, 就会影响性能. 这可以通过配置多线程代理来解决(MTA).
MTA 模式
在 MTA 模式中, 可以指定在任何给定时间点运行的 extproc 代理的最大数量. 请求由多线程代理根据负载来进行提取和服务. MTA 可以使用 "agtctl" 工具来配置.
来源: http://stor.51cto.com/art/201806/576562.htm