(转)在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 procedure..);

方法二、例子2、例子3,都是先创建包头及参数的声明(如游标类型、记录类型、基本类型等),但是并没有声明要实现的存储过程、函数,

而是单独再另外创建一个独立的存储过程,而不是在包体中实现存储过程。单独创建的存储过程是一个具有完整创建语法的存储过程,是一个独立的存储过程,但是该存储过程的参数(如果有需要用到)是要参照引用包头中声明的参数类型。如例子中的游标类型输出参数。

/**************************************************************************************************************/

方法二:

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

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方式下能找到这个存储过程,但是参数不能正确识别。

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

【例子2】

下面的例子创建的包名和存储过程名,在使用时最好在包名和存储过程前面加上用户名,如:用户名.包名.存储过程名,user.pkgNmae.prcName( ....)

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操作部分

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

【例子3】 下面是国外的几个例子,对基础学习比较好:

-- Name: sp_as_source_for_dw.sql
-- Author: Terry Dykstra [TeamPS]
--         Canadian Forest Oil Ltd.
-- Date: 1998/05/09
-- Requirements: Oracle 7.2 or later
-- Notes: You define a package header that uses a ref cursor.(声明包头,使用游标)
-- Then you create a stand-alone procedure that references the result set defined in the package header.

(创建一个独立的存储过程,而不是在包体创建时实现存储过程)
-- Now create a datawindow using stored procedure as source and select the procedure
-- Settings:   DBParm PBDBMS=0
-- Oracle privileges: any of EXECUTE ANY PROCEDURE, CREATE PROCEDURE, CREATE ANY PROCEDURE, depending 
-- on what your DBA allows.
-- Run this script from sql/plus.

-- Create example table
-- ==============================================================================
drop table work_orders
/
create table work_orders (
company varchar2(3),
order_no varchar2(10),
order_date date)
/
insert into work_orders values ('ABC','1000', to_date('1999/03/05','yyyy/mm/dd'))
/
insert into work_orders values ('ABC','1001', to_date('1999/03/07','yyyy/mm/dd'))
/
insert into work_orders values ('ABC','1002', to_date('1999/03/06','yyyy/mm/dd'))
/
insert into work_orders values ('BCD','1002', to_date('1999/03/06','yyyy/mm/dd'))
/
insert into work_orders values ('BCD','1005', to_date('1999/03/15','yyyy/mm/dd'))
/
commit
/
-- 1.Create Package.  Name: a_demo (无输入参数)
-- ==============================================================================
CREATE OR REPLACE PACKAGE a_demo IS

TYPE my_result_set IS REF CURSOR RETURN work_orders%ROWTYPE;

END a_demo;
/

-- Create Procedure.  Name: proc_demo
--  References package a_demo
-- ==============================================================================
CREATE OR REPLACE PROCEDURE proc_demo (out_result IN OUT a_demo.my_result_set)
 AS
 BEGIN
-- return result to datawindow
  OPEN out_result
          FOR SELECT * FROM work_orders;
END proc_demo;
/
-- ==============================================================================
-- 2.Similar example, but now using one retrieval argument
-- Create Package.  Name: a_demo2(有输入参数)
-- ==============================================================================
CREATE OR REPLACE PACKAGE a_demo2 IS

TYPE my_result_set IS REF CURSOR RETURN work_orders%ROWTYPE;

END a_demo2;
/
-- Create Procedure.  Name: proc_demo2
--  References package a_demo2
-- ==============================================================================
CREATE OR REPLACE PROCEDURE proc_demo2 (as_comp IN VARCHAR2, out_result IN OUT a_demo2.my_result_set)
 AS
 BEGIN
-- return result to datawindow
  OPEN out_result
    FOR SELECT * FROM work_orders
    WHERE company = as_comp;
END proc_demo2;
/

-- Create Procedure.  Name: proc_demo2
--  References package  a_demo2a
-- ==============================================================================
CREATE OR REPLACE PROCEDURE proc_demo2a (ad_orderdate IN DATE, out_result IN OUT a_demo2.my_result_set)
 AS
BEGIN
-- return result to datawindow
  OPEN out_result
    FOR SELECT * FROM work_orders
    WHERE order_date = ad_orderdate;
END proc_demo2a;
/

-- ==============================================================================
-- 3.Similar example, but now using one retrieval argument and record type
-- Create Package.  Name: a_demo3(使用记录类型)
-- ==============================================================================
CREATE OR REPLACE PACKAGE a_demo3 IS

TYPE the_record_set IS RECORD (
  ls_company varchar2(3),
  ll_order_count number(3) );
 TYPE my_result_set IS REF CURSOR RETURN the_record_set;
END a_demo3;
/
-- Create Procedure.  Name: proc_demo3
--  References package a_demo3
-- ==============================================================================
 CREATE OR REPLACE PROCEDURE proc_demo3 (as_comp IN VARCHAR2, out_result IN OUT a_demo3.my_result_set)
 AS
BEGIN
-- return result to datawindow
OPEN out_result
  FOR SELECT company, count(*) 
  FROM work_orders
  WHERE company = as_comp
GROUP BY company;
END proc_demo3;
/

/**********************************************************************************************/

下面是在包体中实现包头中声明的存储过程、函数。但是PB会找不到此存储过程及可能不能正常识别存储过程的参数,

因此,必须首先创建一个虚拟的(或说假的)存储过程,且该存储过程与包中声明的存储过程具有相同的参数类型。

/**********************************************************************************************/

/* Use stored procedure within package body.  To use this in the DW, specify:
execute theowner.A_DEMO4.PROC_DEMO4;0 AS_COMP = :AS_COMP
Note: since the PB DW painter cannot see the procedure within the package, you must first create a 
dummy stand-alone procedure that has the same arguments.  For this example you can use the proc_demo2
procedure */
/**********************************************************************************/
-- Create Package.  Name: a_demo4
-- ==============================================================================
CREATE OR REPLACE PACKAGE a_demo4 IS
   TYPE my_result_set IS REF CURSOR RETURN work_orders%ROWTYPE;

  PROCEDURE proc_demo4 (as_comp IN VARCHAR2, out_result IN OUT a_demo4.my_result_set);

END a_demo4;
/

CREATE OR REPLACE PACKAGE BODY a_demo4 IS

PROCEDURE proc_demo4 (as_comp IN VARCHAR2, out_result IN OUT a_demo4.my_result_set) IS

BEGIN
-- return result to datawindow
OPEN out_result
   FOR SELECT * FROM work_orders
   WHERE company = as_comp;
END proc_demo4;
END a_demo4;
/
/***************************************************************************/
看完这段例子,对pb利用oracle8i存储过程做数据源问题应该有认识了,我自己对这方面也有很多疑问,以后多多交流.

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

  1. oracle 存储过程返回结果集 (转载)

    好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...

  2. oracle 存储过程返回结果集

    好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...

  3. 存储过程不返回记录集导致ADO程序出错

    HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF( ...

  4. oracle 存储过程 返回结果集

      oracle 存储过程 返回结果集 CreationTime--2018年8月14日09点50分 Author:Marydon 1.情景展示 oracle存储过程如何返回结果集 2.解决方案 最简 ...

  5. PostgreSQL 调用存储过程返回结果集

    创建返回结果集类型的存储过程: CREATE OR REPLACE FUNCTION public.f_get_member_info( id integer, productname charact ...

  6. C#中使用Oracle存储过程返回结果集

    问题: 在MSSQLServer中定义的存储过程可以直接返回一个数据集,如: create procedure sp_getAllEmployees as SELECT * FROM [NORTHWN ...

  7. oracle存储过程返回结果集

    http://www.2cto.com/database/201204/127180.html oracle实现存储过程返回查询结果集合的方法   --实现存储过程返回查询结果集合的方法 ,以下代码来 ...

  8. Java 调用存储过程 返回结果集

    这里使用Oracle数据库的thin连接. 下面是存储过程SQL 1 createorreplaceprocedure proc3(stid in student.stuid%type, stname ...

  9. Oracle 存储过程例子返回记录集

    转载:https://www.cnblogs.com/mikalshao/articles/1454134.html Oracle 不支持批量查询,因此无法从一个命令返回多个结果集.使用存储过程时,返 ...

随机推荐

  1. Make Blog Beautiful

    想做一个文艺而专业的编程技术博客 :) 博客定位 编程大观园,正如其名,探索和汇萃各种编程思想.技术.技能.技巧,并融入自己对编程开发.产品研发的思考和探索. 分类与标签      好的博客分类能让访 ...

  2. wex5 教程 之 图文讲解 可观察对象的集群应用与绑定技术

    一 前言: wex5官方教程里,开篇即以一个input输入,output即时输出的例子,为我们展现了一个概念:可观察对象.在以后我的项目开发中,将大量运用可观察对象. 那么,问题来了: 1. 可观察对 ...

  3. SQL递归查询(with cte as)

    with cte as ( select Id,Pid,DeptName,0 as lvl from Department where Id = 2 union all select d.Id,d.P ...

  4. myisam压缩(前缀压缩)索引

    myisam使用前缀压缩来减少索引的大小,从而让更多的索引可以放入内存中,默认只压缩字符串,但通过参数配置也可以对整数做压缩,myisam压缩每个索引块的方法是,先完全保存索引块中的第一个值,然后将其 ...

  5. :before\:after伪元素用法

    :before和:after这两个伪元素在真正的页面元素之前和之后插入一个额外的的元素,等效于下面的代码: <p> <span>:before</span> HTM ...

  6. 如何利用.snk文件生成DLL文件中的Publickeytoken

    1.在该路径下C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin查找是否有sn.exe. 没有的话,从网上下载,注意需要的版本. 2.打开c ...

  7. Android Volley完全解析

    1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...

  8. 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍

    回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...

  9. 【入门】匈牙利算法+HNOI2006 hero超级英雄

    一.关于匈牙利算法 匈牙利算法是由匈牙利数学家Edmonds提出的,用增广路径求二分图最大匹配的算法. 听起来高端,其实说白了就是: 假设不存在单相思(单身狗偷偷抹眼泪),在一个同性恋不合法的国家里( ...

  10. [问题2014A07] 解答

    [问题2014A07]  解答 我们分三步进行证明. \(1^\circ\) 先证 \(\alpha_1,\alpha_2\) 线性无关. 用反证法, 设 \(\alpha_1,\alpha_2\) ...