extproc进程
在编程过程中,我们可能会发现有些功能通过PL/SQL完成会很麻烦,而通过C/C++语言编程则会容易很多。因此,Oracle提供了在PL/SQL程序里直接调用外部函数(包括C函数或Java方法)的功能。调用外部函数的过程如下:
- 用户进程执行PL/SQL程序。
- 在执行的PL/SQL程序过程中,调用了一个C/C++语言写的函数:c_func。这里需要借助别名库(Alias Library)。别命苦是数据库里的一个对象,用来描述一个外部函数所在的动态链接库的路径和名称。通过别名库,从而可以知道调用的外部函数在哪个文件里。
- PL/SQL将对外部函数的调用请求发给监听器。
- 监听器生成一个extproc进程,该进程专门用来处理对外部函数的调用。每个session都会生成一个属于该session的extproc进程,并且在整个session生命周期里,extproc进程会一直存在。
- Extproc进程负责将别名库所指定的动态链接库文件加载到内存。
- Extproc进程执行指定的外部函数,并将结果返回给服务器进程,进而返回给用户进程。
需要对监听器进行配置(在listener.ora文件中配置),从而启动extproc进程。
其中“(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))”说明监听extproc进程请求的地址;而SID_DESC部分则说明extproc进程的连接信息。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
这是一个Oracle数据库监听器配置中常见的IPC协议地址条目,主要用于处理PL/SQL调用外部程序的功能5。具体解析如下:
- 协议类型
PROTOCOL = IPC 表示使用进程间通信协议,这是Oracle用于本地进程通信的高效方式。 - 关键参数
KEY = EXTPROC1521是IPC通信的标识符:
- 默认使用EXTPROC1521(1521端口对应)或EXTPROC0
- 该KEY值需与外部过程调用的配置保持一致
EXTPROC1521与EXTPROC0的区别主要体现在以下方面:
- 端口关联性
- EXTPROC1521
名称中的1521明确对应Oracle监听器的默认TCP端口号,用于与TCP监听配置保持命名一致性。这使得该标识符更直观地反映其与标准服务的关联性。 - EXTPROC0
名称中的0属于早期版本的通用命名习惯,未直接关联端口号。这种命名方式常见于非标准端口场景或特定历史版本中。
- 多实例场景下的应用
- EXTPROC1521
通常用于单一实例环境下的IPC通信标识,确保配置文件的简洁性。 - EXTPROC0
在需要同时运行多个监听器或多实例的场景中,可通过递增数字(如EXTPROC0、EXTPROC1)实现标识符的唯一性,避免IPC通道冲突25。
- 配置兼容性
- EXTPROC1521是Oracle默认推荐的外部过程调用标识符,尤其在11g及以上版本中更普遍使用。
- EXTPROC0多见于早期版本或特殊场景(如非默认端口配置),部分第三方工具可能会沿用此命名规则。
- 功能等价性
两者在功能实现上并无差异,均通过IPC协议为PL/SQL调用外部程序(如C/Java函数)提供通信通道。每个会话均会创建独立的extproc进程处理请求57。选择何种标识符主要取决于环境配置要求和命名规范需求。
配置对比示例
# 标准单实例配置 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) # 多实例场景配置 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
注意:修改KEY值后需同步调整listener.ora和tnsnames.ora中的相关配置,确保服务指向一致性。
然后我们还要配置tnsnames.ora文件,注意,该文件也必须位于数据库服务器端(应该是说,tnsname.ora文件的以下内容属于数据库客户端的)。我们需要添加如下内容:
EXTPROC_CONNECTION_DATA=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))
)
(CONNECT_DATA=
(SID=PLSExtProc)
)
)
配置完毕以后,可以尝试tnsping 连接字符串名称,如果成功,则说明监听没有问题。
[oracle@book admin]$ tnsping EXTPROC_CONNECTION_DATA
接下来,我们创建一个C语言编写的函数,如下:
[oracle@book ~]$ vi calc_tax.c
calc_tax(n)
int n;
{
int tax;
tax=(n*15)/100;
return(tax);
}
该函数完成的功能非常简单,计算传入参数的15%,并作为税额返回给调用者。
将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。
ORCLXDB
ORCLXDB 是 Oracle 数据库中的一个默认服务,主要用于支持 XML DB (XDB) 功能。以下是关键点解析:
- XML DB 核心作用
ORCLXDB 服务对应 Oracle 的 XML 数据库功能,提供 XML 数据存储、查询和管理能力。例如:
- 通过 XPath 和 XQuery 处理 XML 数据;
- 支持 XMLType 数据类型;
- 提供 HTTP/WebDAV 协议访问接口。
- 监听与连接管理
通过监听器(如 LSNRCTL)可查看 ORCLXDB 服务的状态,示例输出如下:
服务端:ORCLXDB: Service "ORCLXDB" has 1 instance(s). Instance "ZHH", status READY...
服务状态 READY 表示该服务已注册到监听器并可接收连接请求。
- 与共享服务器模式的关联
在共享服务器架构中,ORCLXDB 可能通过分派器(Dispatcher)进程处理并发请求,提升资源利用率。例如:
- 分派器(Dnnn)接收客户端请求并放入公共队列;
- 共享服务器进程(Snnn)处理队列中的任务。
- 配置与常见问题
- 若服务状态异常(如 UNKNOWN),需检查数据库实例是否正常启动或 XDB 组件是否启用;
- 在 Data Guard 等高可用场景中,需确保主备库的 ORCLXDB 服务配置一致性。
ORCLXDB 是 Oracle XML DB 的默认服务标识,兼具 XML 数据处理与连接管理的双重角色,其运行状态直接影响 XML 功能及监听服务的可用性。




