PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题

PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)

(转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大。

如果是返回数据集的存储过程则需要利用oracle的包来定义游标。 但是若按正规的oracle写法,存储过程写在包体里面,

如果这样的话,PB会找不到此存储过程(如果用直连的方式)(如果用ODBC的方式则有可能不能正常识别存储过程的参数) 因此我们需要将存储过程单独写。

首先我们来看下oracle正规的返回结果集的存储过程的写法

方法一:

create or replace package pkg_Sp_Changebill --基于更改单的包

--创建包(因为oracle 的存储过程若想要返回记录集则需要利用游标的方式来实现)

as

Type Cur_myRecord Is ref Cursor RETURN item%RowType;

procedure sp_mx3_wgggcp(stritemid varchar2, cur_List out cur_MyRecord);

end pkg_Sp_Changebill;

/

create or replace package body pkg_Sp_Changebill

as

procedure sp_mx3_wgggcp(stritemid varchar2,cur_List out cur_MyRecord)

as

Begin

--存储过程的执行体

open cur_List for select * from item where itemid =stritemid ;

end sp_mx3_wgggcp;

end pkg_Sp_Changebill;

如果按上述写法,则在PB中如果是按直接方式来连接数据库的则会找不着这个存储过程,如果是按odbc方式来连接数据库的则能找到些存储过程但是无法正确识别参数。

方法二:

下面这种写法是没有将存储过程包含在包里的:

create or replace package pkg_Sp_Changebill3

as

Type Cur_myRecord Is ref Cursor RETURN item%RowType; --指明此游标是按item表记录的形式返回

end pkg_Sp_Changebill3;

/

create or replace procedure sp_mx3_wgggcp3(stritemid varchar2, cur_List out pkg_Sp_Changebill3.cur_MyRecord)—游标可直接用 包名.游标名

as

Begin

--存储过程的执行体

open cur_List for select * from item where itemid = stritemid;

end sp_mx3_wgggcp3;

在直连方式下能找到此存储过程且能正常识别参数。在odbc方式下能找到这个存储过程,但是参数不能正确识别。

另外,一般创建包名和存储过程名时,在包名和存储过程前面加上用户名,

:用户名.包名,CREATE OR REPLACE PACKAGE username.pkgNmae AS .......

 

================================================================

【例子2】

Oracle包的应用——使用存储过程作为数据窗口对象的数据源 第一步:创建包

CREATE OR REPLACE PACKAGE SONGZHENYI.visitOfTimeInfor  -- 注意:用户名.包名
AS
   --为了使存储过程返回一个结果集,第一步:声明一个记录;第二步;声明一个引用游标;
   TYPE recordePatVist
   IS
      RECORD (
         charPatientId       pat_visit.patient_id%TYPE,
         numPatientVisitId   pat_visit.visit_id%TYPE,
         charToDept          pat_visit.dept_admission_to%TYPE,
         charToDateTime      pat_visit.admission_date_time%TYPE
      );

   --声明一个引用游标
   TYPE cursorPatVist IS REF CURSOR
      RETURN recordePatVist;

     );
END visitOfTimeInfor;

第二步:创建存储过程

CREATE OR REPLACE PROCEDURE SONGZHENYI.prcResultPatVisit (
   numVisitId   IN     pat_visit.visit_id%TYPE,
   curResult       OUT visitOfTimeInfor.cursorPatVist
)
IS
BEGIN
   OPEN curResult FOR
      SELECT   patient_id,
               visit_id,
               dept_admission_to,
               admission_date_time
        FROM   pat_visit
       WHERE   visit_id > numVisitId AND dept_discharge_from IS NOT NULL;
END prcResultPatVisit;

第三步:PB操作部分

数据源选择存储过程即可。其余部分雷同。

点击打开链接


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值