欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

【oracle笔记】外部过程

程序员文章站 2022-06-11 16:33:17
...

oracle存储的过程可以采用PL/SQL或Java语言进行编写。而在某些情况下,开发人员可能希望使用其他语言。这时就会用到外部过程调用,即在PL/SQL程序内调用其他语言编写的程序。 oracle支持的外部过程必须使用C语言编写。 与OCI库连接的用户进程软件,则可以使

oracle存储的过程可以采用PL/SQL或Java语言进行编写。而在某些情况下,开发人员可能希望使用其他语言。这时就会用到外部过程调用,即在PL/SQL程序内调用其他语言编写的程序。oracle支持的外部过程必须使用C语言编写。与OCI库连接的用户进程软件,则可以使用C或C++语言编写。

一般来说,性能是使用C语言的原因。PL/SQL存储过程或Java存储过程都不能被操作系统直接执行,在调用存储过程的时候,都需要进行大量的解释。而以C语言编写的函数不仅可以被编译为对象代码并进行链接,而且还可以加快许多操作(如跳转)。

PL/SQL过程调用外部过程时,外部过程代理程序会将PL/SQL调用转换成C调用,载入共享对象库,并执行所请求的C语言函数

调用外部过程的时候,侦听器会启动一个被称为外部过程代理程序的进程,该进程使用其唯一的函数,动态地连接和运行外部过程来响应数据库用户的调用。在执行代码之前,动态链接库必须先完成动态的连接。

在默认情况下,外部过程代理程序只从ORACLE_HOME/bin目录中载入共享对象库,以保障内置的安全性。可以在listener.ora文件中指定代理程序能够载入的共享库。

外部过程(C语言函数)经过编译,作为共享对象库链接操作系统。


创建外部过程:

编写、编译、连接C语言函数

创建Oracle共享对象库,即创建逻辑指针,指向编程人员交付的物理文件(共享对象库)。

创建调用C语言函数的PL/SQL过程。


配置侦听器启动外部过程代理程序

代理程序根据需要启动,每个回话都有一个代理程序,并且在回话的生存期内保持活动状态,使用共享内存。可以通过Net Manager 或者手动编辑listener.ora配置外部过程代理程序。

在listener.ora加入如下:

EXT_PROC_LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)


SID_LIST_EXT_PROC_LISTENER =
(SID_LIST =
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
)
)


配置侦听器之后,我们还需要配置Oracle Net的客户端,从而使服务器进程在其希望运行某个外部过程时能够找到这个外部过程。此时,我们需要配置数据库服务器上的tnsname.ora文件或通过Net Manager进行配置

在tnsname.ora文件中加入:

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
连接串的别名为EXTPROC_CONNECTION_DATA,Oracle始终会通过查找这个别名来发现外部过程侦听器的地址。外部过程侦听器的地址为IPC键EXTPROC1,必须与侦听器配置文件中指定的侦听器地址相匹配。







Java语言解释执行的过程:Java源程序经过编译生成java字节码(不依赖于机器硬件平台的二进制代码),然后由Java虚拟机对字节码进行解释执行。解释执行的过程分为三步:代码装入(类下载器完成)、校验代码(字节码校验器)、运行代码。JVM是字节码和硬件系统之间的接口。运行jvm字符码的工作是由解释器来完成的。

C语言编译执行的过程,分为编译和连接两个阶段。编译阶段就是读取源程序,对其进行词法和语法分析,将高级语言指令转换成等效的汇编代码,再由汇编程序转换为机器语言,生成目标文件。连接程序就是将有关的目标文件彼此相连,以及用到的库文件进行组织形成可执行代码。

即编译阶段将源程序(*.c)转换成为目标代码(,一般是obj文件),连接阶段是把源程序转换成的目标代码(obj文件)与你程序里面调用的库函数对应的代码连接起来形成对应的可 执行文件(exe文件)。