WEB开发网
开发学院数据库Oracle 在Oracle/2000中调用Windows API函数 阅读

在Oracle/2000中调用Windows API函数

 2007-05-12 12:25:05 来源:WEB开发网   
核心提示: (3)用ORA_FFI.REGISTER_PARAMETER来注册外部函数的参数类型,对每一个参数都要提供它的外部函数柄和相应的PL/SQL数据类型,在Oracle/2000中调用Windows API函数(2),参数注册的顺序必须与它们出现在外部函数原型中的顺序一致,(4)用ORA_FF

(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_return(fh_WinExec,
  ORA_FFI.C_INT);/*返回值注册,原类型为BOOL*/
  
  ENDWinExec;

可以将多个外部函数的PL/SQL接口放在一个包内。要在Developer/2000的FormDesigner中使用这些外部函数,只要把包含这一程序包的程序库(.PLL)附加进来,使用包名.函数名就可激活这个外部函数。

例如:WinExec.WinExec('c:windows otepad.exe',0)

具体WindowsAPI函数数据类型和PL/SQL数据类型的转换可参照Developer/2000中ProcedureBuilder帮助文件中对ORA_FFI软件包的详细介绍。

上一页  1 2 

Tags:Oracle 调用 Windows

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接