归纳起来PB6.0中调用Oracle存储过程有以下四种方法。
  方法一:以关键字RPCFUNC声明存储过程;
  方法二:以DECLARE PROCEDURE语句声明存储过程;

  方法三:以动态SQL语句实现;

   方法四:调用函数PBDBMS.Put_Line。

一般情况下,方法一能得到较好的运行效率和更完善的功能。因此推荐使用方法一。但是某些类型的存储过程只能使用其他方法。以下重点介绍方法一和方法二。

  两种方法比较起来,有以下几点主要区别:
  1)方法一适用于具有IN、OUT和IN OUT参数的存储过程,而方法二仅支持IN和OUT参数,不支持IN OUT参数;
  2)方法一对参数的数目无限制,方法二最多支持255个参数;
  3)方法一不支持记录(Recorder)的传递,方法二可传递和接收记录。
  方法一操作步骤:
  1)在用户对象画笔中创建一个Class_Standard类型的,从Transaction继承的用户对象。
->Remote stored Procedure(s)或者点右键选择Pasete special->SQL->Remote stored Procedure(s)。

PB调用postgresql存储过程 pb调用oracle存储过程_SQL

在弹出对象框中,选择要调用的后台存储过程,会自动生成调用语句。

PB调用postgresql存储过程 pb调用oracle存储过程_RPCFUNC_02

或直接输入类似subroutine TEST(long id,ref string name)RPCFUNC ALIAS FOR “DEV.TEST”的语句。例如中DEV.TEST的参数为(id IN NUMBER,name IN OUT VARCHAR2)。

  3)保存该用户对象。
  4)在Application画笔中,进入应用属性对话框,在Variable Types页,将上Transaction用户对象设置为缺省的全局变量SQLCA。
  5)脚本中,编码调用相应的外部函数。形式:SQLCA.函数名(参数)。如可用“SQLCA.TEST(ln_id,ls_name);”调用例子中定义的DEV.TEST存储过程。其中ln_id,ls_name为调用参数。
  方法一注意事项:
  1)由于PB中String类型的数据长度是动态分配的,因此对Ref String类型的参数,每次调用前需要申请足够的空间。例如上例从输入的id值检索name,后台声明的NAME数据类型为VARCHAR2(30),每次调用SQLCATEST前需要用ls_name=SPACE(30)置ls_name为足够长度的空串。
  2)类似地当传递的参数为数组(后台称PL/SQL Table)时,声明参数为相应类型的动态数组,并在每次调用前设置数组上界为足够大的值。例如:DEV用户的DEPT包中声明了TYPE tbl_name IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;存储过程EMP_OF_DEPT(dept_id IN NUMBER,name OUT DEPT.tbl_name)返回部门编写为dept_id的部门的所有员工,置name数组中。假定所有部门的员工数目不超过100,则可用以下语句声明和调用DEVEMP_OF_DEPT:
 

Declare External Functions对话框中:
  Subroutine EMP_OF_DEPT(long dept_id,ref string name[]) RPCFUNC ALIAS FOR ″DEV.EMP_OF_DEPT″
  PowerScript脚本中:
  long ln=dept_id
  string lsa_name[]
  ……
  lsa_name[100]=″ //置动态数组lsa_name上界为100
  ln_dept_id=2
  SQLCA.EMP_OF_DEPT(ln_dept_id,lsa_name) //检索部门2的所有员工的名字