外部程序其实是储存在DLL或是共享库中的二进制程序,并且可以通过PL/SQL声明从存储程序中访问得到它。这既使得它们成为了存储程序开发者们最强大的开发工具之一。
但是,事实上人们很少使用这些外部程序,也许是因为人们觉得创建DLL和共享库,安装程序以及引用PL/SQL这一系列过程让人觉得非常繁琐。而对应的文档并不能起到什么帮助作用,因为这些文档提供的都是一些深奥的例子,它描述了使用的变量以及子程序使问题变得更加令人费解。
你可以在许多不同的程序编译语言中来创建DLL以及共享库,你也可通过转化脚本语言为二进制代码来实现DLL以及共享库的创建。DLL与共享库作为独立与操作系统的一部分,其实就是像调用执行文件的一部分那样被连接和调用的具有公共入口的二进制映像。这里有一个用C描述的用于二进制处理的DLL:
/* bitop.c */
#ifdef WIN32
#define DLLEXP __declspec(dllexport)
#else
#define DLLEXP
#endif /* WIN32 */
DLLEXP int bitand(int r,int l) { return r & l; }
DLLEXP int bitor(int r,int l) { return r
| l; }
DLLEXP int bitxor(int r,int l) { return r ^ l; }
DLLEXP int bitshr(int n,int s) { return n << s;
}
DLLEXP int bitshl(int n,int s) { return n >> s;
}
DLLEXP int bitset(int n,int b) { return n | (1<<b);
}
DLLEXP int bitclr(int n,int b) { return n ^ (1<<b);
}
DLLEXP int bittst(int n,int b) { return (n & (1<<b))
? 1 : 0; }
其中唯一超出标准C范围的就是DLLEXP宏,他为Windows提供了这些函数名并且可能被UNIX所忽视。将这些资源代码与你的编译文档相对照,从而你可以从中了解更多关于如何创建DLL的信息。在UNIX环境下使用GNU编译器的话,则包括以下命令行:
GNU C/C++: cc -shared -o libbitop.so.1 bitop.c
从数据库中调用DLL和共享库的下一步就是使用CREATE LIBRARY命令,并给出完整的路径,例如:
CREATE OR REPLACE LIBRARY SCOTT.bitop AS '/home/scott/bitop/libbitop.so.
通常只有DBA账号拥有执行这个命令的权限,但此命令可通过其他用户的行为发出。
然后,这个用户能调用PL/SQL和外部程序来调用任何DLL和共享库,代码如下:
create or replace package bit_op
as
function bit_and(l pls_integer,r
pls_integer) return pls_integer
as language c name "bitand"
library bitop;
--
function bit_or(r pls_integer,l
pls_integer) return pls_integer
as language c name "bitor"
library bitop;
--
function bit_xor(r pls_integer,l
pls_integer) return pls_integer
as language c name "bitxor"
library bitop;
--
function bit_shr(n pls_integer,s
pls_integer) return pls_integer
as language c name "bitshr"
library bitop;
--
function bit_shl(n pls_integer,s
pls_integer) return pls_integer
as language c name "bitshl"
library bitop;
--
function bit_set(n pls_integer,b
pls_integer) return pls_integer
as language c name "bitset"
library bitop;
--
function bit_clr(n pls_integer,b
pls_integer) return pls_integer
as language c name "bitclr"
library bitop;
--
function bit_tst(n pls_integer,b
pls_integer) return pls_integer
as language c name "bittst"
library bitop;
end bit_op;
/