="t18">
OracleDeveloper/2000是Oracle
微机开发工具
由于它和Oracle数据库
紧密连接
比用PowerBuilder或其它高级语言采用ODBC和Oracle
连接享有得天独厚
优点
越来越在Windows95和WindowsNT平台上得到广泛应用
笔者在用其进行
设计时感到
既然是在Windows平台上开发
假如能在其中应用
些WindowsAPI
将使Developer/2000有如虎添翼
感觉
可以大大弥补它和底层操作系统
联系能力差、控制实时硬件设备功能差
缺点
开发出集成性更好
应用
所有用第 3方语言编写
子
对Developer/2000都称为外部
WindowsAPI
也是外部
这些外部
必须包含在
个动态库中
例如WINDOWS操作系统下
动态链接库或UNIX系统下
共享库等
Developer/2000通过为每
个外部
产生
个PL/SQL接口
它使用PL/SQL
语法
在
中
这
接口
就可以激活这
外部
对
个外部
产生
个PL/SQL接口
需要用到内建软件Software包ORA-FFI
它包含
些PL/SQL
子
用来对外部
生成PL/SQL接口
实际操作时可以用ProcedureBuilder产生
个
库
在
库中建立
个
包(Package),在这个包中实现对外部
建立连接
下面介绍这
过程
具体步骤:
1.
化外部
就是介绍说明包含外部
动态链接库
位置
并从中分离出外部
原型
并将外部
中主语言
数据类型和PL/SQL数据类型做
对应
匹配
这是在包体(PackageBody)中进行
具体分以下几步:
(1)用OQA_FFI.LOAD_LIBRARY得到包含外部
动态链接库
库柄
此时需提供动态链接库
名字和位置
(2)用ORA_FFI.REGISTER_FUNCTION得到外部
柄
这时需提供动态链接库
库柄和外部
名
(3)用ORA_FFI.REGISTER_PARAMETER来注册外部
参数类型
对每
个参数都要提供它
外部
柄和相应
PL/SQL数据类型
参数注册
顺序必须和它们出现在外部
原型中
顺序
致
(4)用ORA_FFI.REGISTER_RETURN来注册外部
返回值类型
这时需要提供它
外部
柄和相应
PL/SQL数据类型
2.将外部
和
个PL/SQL子
相关联
个和外部
建立关联
PL/SQL子
实际上指明了外部
内存地址
每次
这个子
实际上是
和它相对应
外部
具体步骤为:
(1)用ORA_FFI.FIND_FUNCTION或ORA_FFI.REGISTER_FUNCTION得到
个
柄
(2)在PL/SQL包体
声明部分
定义
个PL/SQL子
它
第
个参数是类型为ORA_FFI.FUNCHANDLETYPE,接下来是依次对应外部
参数
PL/SQL数据类型
参数
(3)在这个PL/SQL子
中加入
个PRAGMA接口
PRAGMA声明就是通过将控制转到
个内存地址
来激活这个外部
3.生成
个模拟外部
原型
PL/SQL子
这个子
就是用户可见
外部
PL/SQL接口
用户按照它
参数类型和返回值类型来使用外部
具体步骤为:
(1)在包体
声明部分
定义
个PL/SQL子
它
参数和返回值是和外部
对应
PL/SQL类型
这就是模拟外部
原型
个子
(2)在这个子
中
和上步生成
和外部
相关联
PL/SQL子
(3)在PL/SQL包
介绍说明(PackageSpefication)部分
输入这个PL/SQL子
原型
下面是
个完整
为WindowsAPI
winexec建立PL/SQL接口
例子:
PACKAGEWinExecIS
FUNCTIONWinExec(ExecfileINVARCHAR2,
commandINPLS_INTEGER)
RETURNPLS_INTEGER;
END;/*在包介绍说明部分是模拟外部
原型PL/SQL原型介绍说明*/
PACKAGEBODYWinExecIS
lh_USERora_ffi.libHandleType;/*定义库柄类型变量*/
fh_WinExecora_ffi.funcHandleType;/*定义柄类型变量*/
FUNCTIONi_WinExec(funcHandleINora_ffi.funcHandleType,
ExecfileINOUTVARCHAR2,
commandINPLS_INTEGER)
RETURNPLS_INTEGER;
PRAGMAINTERFACE(C,i_WinExec,11265);
/*步骤2将个PL/SQL子和外部相关联*/
FUNCTIONWinExec(ExecfileINVARCHAR2,
commandINPLS_INTEGER)
RETURNPLS_INTEGER
IS
execfile_lVARCHAR2(512):=Execfile;
rcPLS_INTEGER;
BEGIN
rc:=i_WinExec(fh_WinExec,
execfile_l,
command);
RETURN(rc);
END;
/*步骤3中PL/SQL模拟定义
它实际上就是步骤2中和外部建立关联那个*/
BEGIN
BEGIN
lh_USER:=ora_ffi.find_library('Kernel32.dll');
EXCEPTIONWHENora_ffi.FFI_ERRORTHEN
lh_USER:=ora_ffi.load_library(NULL,'kernel32.dll');
END;/*得到动态链接库库柄*/
fh_WinExec:=ora_ffi.register_function
(lh_USER,'WinExec',ora_ffi.PASCAL_STD);
/*得到外部柄*/
ora_ffi.register_parameter(fh_WinExec,
ORA_FFI.C_CHAR_PTR);/*参数注册原类型为LPCSTR*/
ora_ffi.register_parameter(fh_WinExec,
ORA_FFI.C_INT);/*参数注册原类型为UINT*/
ora_ffi.register_(fh_WinExec,
ORA_FFI.C_INT);/*返回值注册原类型为BOOL*/
ENDWinExec;
可以将多个外部
PL/SQL接口放在
个包内
要在Developer/2000
FormDesigner中使用这些外部
只要把包含这
包
库(.PLL)附加进来
使用包名.
名就可激活这个外部
例如:WinExec.WinExec('c:\windows\notepad.exe',0)
具体WindowsAPI
数据类型和PL/SQL数据类型
转换可参照Developer/2000中ProcedureBuilder帮助文件中对ORA_FFI软件Software包
具体介绍
延伸阅读
最新评论