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操作部分
数据源选择存储过程即可。其余部分雷同。
点击打开链接