PB 调用存储过程[Oracle]


    

PB 调用存储过程[Oracle]

分类: oracle pb实例 pb知识库 1130人阅读 评论(0) 收藏 举报

一、PB中调用过程的一般格式

  1. Declare my_proce Procedure For p_get_name;  
  2. // 定义过程调用  
  3.   
  4. Execute my_proce ;  
  5. // 执行过程,这里是不需要其他参数的  
  6.   
  7. If SQLCA.SQLCode <> 0 Then // 调用过程出现错误处理  
  8. End If  
  9.   
  10. Fetch my_proce Into :ls_ReturnName;  
  11. // 获取出参值,也就是OUT的变量,如果没有out类型的变量,这句也就不需要了  
  12.   
  13. If SQLCA.SQLCode <> 0 Then // 获取数据出现错误处理  
  14. End If  
  15.   
  16. Close my_proce ;  
  17. // 关闭调用  
  18.    
Declare my_proce Procedure For p_get_name;
// 定义过程调用

Execute my_proce ;
// 执行过程,这里是不需要其他参数的

If SQLCA.SQLCode <> 0 Then // 调用过程出现错误处理
End If

Fetch my_proce Into :ls_ReturnName;
// 获取出参值,也就是OUT的变量,如果没有out类型的变量,这句也就不需要了

If SQLCA.SQLCode <> 0 Then // 获取数据出现错误处理
End If

Close my_proce ;
// 关闭调用
 

二、下面主要表述不同的存储过程对应的定义方式

一、 无入参存储过程调用

  1. Create Or Replace Procedure p_get_name(v_name Out Varchar2) As  
  2. //存储过程,有一个out类型参数,无入参  
  3. Begin   
  4.     v_name := 'Jone';  
  5. End;  
  6.   
  7. //在PB中这样定义  
  8. Declare my_proce Procedure For p_get_name;   // 正确  
  9. Declare my_proce Procedure For p_get_name(); // 这个也正确  
  10. //如果你试图传一个参数  
  11. Declare my_proce Procedure For p_get_name(:ls_Name); 这个就会在执行的时候报错了      
Create Or Replace Procedure p_get_name(v_name Out Varchar2) As
//存储过程,有一个out类型参数,无入参
Begin 
    v_name := 'Jone';
End;

//在PB中这样定义
Declare my_proce Procedure For p_get_name;   // 正确
Declare my_proce Procedure For p_get_name(); // 这个也正确
//如果你试图传一个参数
Declare my_proce Procedure For p_get_name(:ls_Name); 这个就会在执行的时候报错了    

二、 有入参存储过程调用

  1. Create Or Replace Procedure p_get_name(v_First in Varchar2,  
  2.                                        v_Last  in varchar2,  
  3.                                        v_name Out Varchar2) As  
  4. Begin  
  5.     v_name := v_First||v_Last;  
  6. End;  
  7.   
  8. //在PB中这样定义 ,这里起名A ,B ,主要是为了不以字面意义影响了思路  
  9.   
  10. Declare my_proce Procedure For p_get_name(:ls_A ,:ls_B)  
  11. //正确,这里的变量会和过程变量循序的对应 ,也就是ls_A对应v_first ,ls_B 对应 v_Last  
  12.   
  13. Declare my_proce Procedure For p_get_name(:ls_B ,:ls_A)  
  14. //正确,这里的变量会和过程变量循序的对应 ,也就是ls_B对应v_first ,ls_A 对应 v_Last  
  15.   
  16. Declare my_proce Procedure For p_get_name("Michael ","Jordan")   
  17. //错误,直接使用值是不行的,必须使用变量  
  18.   
  19. //我们来指定对应关系,这样就不依赖你输入的顺序了  
  20. Declare my_proce Procedure For p_get_name(v_last=>:ls_A,v_first=>:ls_B)  
  21. Declare my_proce Procedure For p_get_name(v_first=>:ls_B,v_last=>:ls_A)   
  22. //上面这2个定义是完全一样的  
  23.   
  24. Declare my_proce Procedure For p_get_name(v_first1=>:ls_First,v_last=>:ls_Last)   
  25. //这个定义是错误的 ,因为过程中根本就没有叫v_first1的参数  
  26.   
  27. Declare my_proce Procedure For p_get_name(:ls_A ,:ls_B,:ls_C)  
  28. //错误,你试图给给OUT类型的参数也传一个进去就错误了  
  29.   
  30. /*注意: 如果存储过程定义的OUT类型的参数不在最后,而是位于入参的中间或者前面的话,那么在PB中定义的话就必须指定对应,否则会报错的,比如:*/  
  31. Create Or Replace Procedure p_get_name(v_name Out Varchar2,  
  32.                        v_First in Varchar2,  
  33.                                        v_Last  in varchar2  
  34.                                        ) As  
  35. Begin  
  36.     v_name := v_First||v_Last;  
  37. End;  
  38. //这是就必须使用 v_First=> ,v_Last=>这样的定义 ,否则就是错误的   
Create Or Replace Procedure p_get_name(v_First in Varchar2,
                                       v_Last  in varchar2,
                                       v_name Out Varchar2) As
Begin
    v_name := v_First||v_Last;
End;

//在PB中这样定义 ,这里起名A ,B ,主要是为了不以字面意义影响了思路

Declare my_proce Procedure For p_get_name(:ls_A ,:ls_B)
//正确,这里的变量会和过程变量循序的对应 ,也就是ls_A对应v_first ,ls_B 对应 v_Last

Declare my_proce Procedure For p_get_name(:ls_B ,:ls_A)
//正确,这里的变量会和过程变量循序的对应 ,也就是ls_B对应v_first ,ls_A 对应 v_Last

Declare my_proce Procedure For p_get_name("Michael ","Jordan") 
//错误,直接使用值是不行的,必须使用变量

//我们来指定对应关系,这样就不依赖你输入的顺序了
Declare my_proce Procedure For p_get_name(v_last=>:ls_A,v_first=>:ls_B)
Declare my_proce Procedure For p_get_name(v_first=>:ls_B,v_last=>:ls_A) 
//上面这2个定义是完全一样的

Declare my_proce Procedure For p_get_name(v_first1=>:ls_First,v_last=>:ls_Last) 
//这个定义是错误的 ,因为过程中根本就没有叫v_first1的参数

Declare my_proce Procedure For p_get_name(:ls_A ,:ls_B,:ls_C)
//错误,你试图给给OUT类型的参数也传一个进去就错误了

/*注意: 如果存储过程定义的OUT类型的参数不在最后,而是位于入参的中间或者前面的话,那么在PB中定义的话就必须指定对应,否则会报错的,比如:*/
Create Or Replace Procedure p_get_name(v_name Out Varchar2,
                       v_First in Varchar2,
                                       v_Last  in varchar2
                                       ) As
Begin
    v_name := v_First||v_Last;
End;
//这是就必须使用 v_First=> ,v_Last=>这样的定义 ,否则就是错误的 

三、INOUT类型过程的调用

  1. //PB中使用Declare方式不能调用具有in out类型参数的存储过程的,故采用外部接口的方式  
  2. //直接上步骤   
  3.   
  4. 1. 创建一个事务对象 uo_transcation , new->pb object->standart class->transcation ,命名为uo_transcation   
  5. 2. 在uo_transcation 的Local External Functions 中定义存储过程,形如:  
  6.    subroutine p_get_name(string v_First, string v_Last,ref string v_name) rpcfunc  
  7.   
  8.    1. subroutine 过程无返回值  
  9.    2. rpcfunc  不明白,照写吧 ,呵呵  
  10.    3. ref 这个是重点 ,代表这变量可以是outin out 类型  
  11. 3. 把uo_transcation 当作默认事务对象   
  12.    1. 找到application ,也就是你程序写第一open的那个地方  
  13.    2. 点击菜单 view -> propreties 就打开application的属性了  
  14.    3. 点击 additional Properties -> variable Types ->sqlca 下面框修改成uo_transcation   
  15.    4. OK  
  16. 4. 在程序中直接使用 sqlca.p_get_name(a,b,c)这样的就可以 ,和普通函数一样  
  17.   
  18. 注意: 其实这也是PB调用存储过程的一个方法  
//PB中使用Declare方式不能调用具有in out类型参数的存储过程的,故采用外部接口的方式
//直接上步骤 

1. 创建一个事务对象 uo_transcation , new->pb object->standart class->transcation ,命名为uo_transcation 
2. 在uo_transcation 的Local External Functions 中定义存储过程,形如:
   subroutine p_get_name(string v_First, string v_Last,ref string v_name) rpcfunc

   1. subroutine 过程无返回值
   2. rpcfunc  不明白,照写吧 ,呵呵
   3. ref 这个是重点 ,代表这变量可以是out,in out 类型
3. 把uo_transcation 当作默认事务对象 
   1. 找到application ,也就是你程序写第一open的那个地方
   2. 点击菜单 view -> propreties 就打开application的属性了
   3. 点击 additional Properties -> variable Types ->sqlca 下面框修改成uo_transcation 
   4. OK
4. 在程序中直接使用 sqlca.p_get_name(a,b,c)这样的就可以 ,和普通函数一样

注意: 其实这也是PB调用存储过程的一个方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值