1. 一次数据库连接,返回多个结果集

1.1 建立包规范

create or replace package QX_GDJTJ is
-- Author : xxx
-- Created : 2012-1-1
-- Purpose : 统计主设备缺陷 TYPE T_CURSOR IS REF CURSOR;
PROCEDURE GETGDJQXTJ
(
cur_id in varchar,
cur_GDJQXTJ1 OUT T_CURSOR,
cur_GDJQXTJ2 OUT T_CURSOR,
cur_GDJQXTJ3 OUT T_CURSOR
); end QX_GDJTJ;

1.2 建立包体

create or replace package body QX_GDJTJ is
PROCEDURE GETGDJQXTJ
(
cur_id in varchar,
cur_GDJQXTJ1 OUT T_CURSOR,
cur_GDJQXTJ2 OUT T_CURSOR,
cur_GDJQXTJ3 OUT T_CURSOR
)
IS
BEGIN
OPEN cur_GDJQXTJ1 FOR
select (select count(0) from HVM_VIEW_QX where voltage='500kV' and gdjid=cur_id )-(select count(0) from HVM_VIEW_QX where voltage='500kV' and gdjid=cur_id and cljg like '%合格%' and cljg not like '%不合格%') from dual;
OPEN cur_GDJQXTJ2 FOR
select (select count(0) from HVM_VIEW_QX where voltage='220kV' and gdjid=cur_id )-(select count(0) from HVM_VIEW_QX where voltage='220kV' and gdjid=cur_id and cljg like '%合格%' and cljg not like '%不合格%') from dual;
OPEN cur_GDJQXTJ3 FOR
select (select count(0) from HVM_VIEW_QX where voltage='110kV' and gdjid=cur_id )-(select count(0) from HVM_VIEW_QX where voltage='110kV' and gdjid=cur_id and cljg like '%合格%' and cljg not like '%不合格%') from dual;
end GETGDJQXTJ;
end QX_GDJTJ;

1.3 C#调用,返回结果集

public static DataSet GetDataSet(string gdjId, string proName, string[] cursors)
{
OracleConnection Conn = GetConn();
DataSet ds = new DataSet();
try
{
    OracleCommand cmd = new OracleCommand();
    cmd.Connection = Conn;
    cmd.CommandText = proName;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("cur_id", OracleType.VarChar).Value = gdjId;
    for (int i = 0; i < cursors.Length; i++)
    {
      cmd.Parameters.Add(cursors[i], OracleType.Cursor).Direction = ParameterDirection.Output;
    }
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.Fill(ds);
}
catch (System.Data.OracleClient.OracleException ex)
{
throw new Exception(ex.Message);
}
finally
{
Conn.Close();
}
return ds;
}

2. 基础知识

在给出具体的方法之前,我们先来看看以下几个名词的含义。

2.1 包的组成

包头(package):包头部分申明包内数据类型,常量,变量,游标,子程序和异常错误处理,这些元素为包的公有元素。

包主体(package body):包主体则是包定义部分的具体实现,它负责为包头中所声明子程序提供具体的实现,在包主体中还可以声明包的私有元素。

包头和包主体分开编译,并作为两个分开的对象分别存放在数据库字典中。

2.2 包的语法规则

包头的语法如下:

create or replace package 包名
As | IS
procedure 过程名();
Function 函数名() return 数据类型;
变量定义;
异常定义;
光标定义;
...........
...........
End 包名;

包体创建的语法:

create or replace Package Body 包名
As | IS
Procedure 过程定义;
Procedure 过程定义;
Function 函数定义;
Function 函数定义;
.........; end 包名;

2.3 示例

示例1

create or replace package circle_package
as
pi number(6,2):=3.14;
function fun_get_circle_area(param_r number) return number;
function fun_get_circle_c(param_r number) return number;
end circle_package;
/ create or replace package body circle_package
as
function fun_get_circle_area(param_r number) return number
as
begin
return pi*power(param_r,2);
end; function fun_get_circle_c(param_r number) return number
as
begin
return pi*param_r*2;
end;
end circle_package;
/ declare
v_area number(6,2);
v_c number(6,2);
v_r number(5):=3;
begin
v_area:=circle_package.fun_get_circle_area(v_r);
v_c:=circle_package.fun_get_circle_c(v_r);
Dbms_output.put_line('圆的半径:'||v_r );
Dbms_output.put_line('圆的周长:'||v_c );
Dbms_output.put_line('圆的面积:'||v_area );
end;

SQL> set serveroutput on;
SQL> /

圆的半径:3
圆的周长:18.84
圆的面积:28.26

PL/SQL procedure successfully completed

示例2

下面是student 和SC表的定义:

    CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(4),
Sage SMALLINT,
Sdept CHAR(20)) tablespace starivespace; CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(6) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno),
constraint f1 FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
) tablespace starivespace

实例:定义一个包,实现如果功能: 输入学号,分别返回该学生的所在系和相应的选课成绩(如果有多门成绩,那么就输出多门成绩)。

定义包头:

    create or replace
package sdept_or_grade as
procedure print_sdept(psno char);
procedure print_grade(psno char);
end;
/
  1. 程序包已创建。

创建包体:

    create or replace
package body sdept_or_grade
as
procedure print_sdept(psno char) as
psdept student.sdept%type;
begin
select sdept into psdept
from student
where sno=psno;
dbms_output.put_line(psdept);
exception
when no_data_found then
dbms_output.put_line(\'Invalid student number\');
end;
procedure print_grade(psno char) as
pgrade SC.grade%type;
cursor printgrade is select grade into pgrade
from sc
where sno=psno; begin
open printgrade;
loop
fetch printgrade into pgrade;
dbms_output.put_line(pgrade);
exit when printgrade%notfound;
end loop;
close printgrade;
exception
when no_data_found then
dbms_output.put_line(\'Invalid student number\');
end;
end;
/

程序包体已创建。

获取结果:

SQL> set serveroutput on;
SQL>
SQL> execute sdept_or_grade.print_sdept(\'0201\');
cs PL/SQL 过程已成功完成。 SQL>
SQL> execute sdept_or_grade.print_grade(\'0201\');
89
64
50
50 PL/SQL 过程已成功完成。

参考文章

gooliugleOracle :一次数据库连接,返回多个结果集(带参数)!

德州仪器Oracle package包头和package body包体例子

Oracle :一次数据库连接,返回多个结果集的更多相关文章

  1. Oracle存储过程实现返回多个结果集 在构造函数方法中使用 dataset

    原文 Oracle存储过程实现返回多个结果集 在构造函数方法中使用 dataset DataSet相当你用的数据库: DataTable相当于你的表.一个 DataSet 可以包含多个 DataTab ...

  2. Oracle中函数/过程返回结果集的几种方式

    原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式:    以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.    ...

  3. Mybatis下配置调用Oracle自定义函数返回的游标结果集

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  4. Oracle常用函数:DateDiff() 返回两个日期之间的时间间隔自定义函数

    首先在oracle中没有datediff()函数可以用以下方法在oracle中实现该函数的功能:1.利用日期间的加减运算天:ROUND(TO_NUMBER(END_DATE - START_DATE) ...

  5. Oracle中函数/过程返回多个值(结果集)

    Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. (1) 返回游标: return的类型为:SYS_REFCUR ...

  6. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  7. windows 环境怎样恢复 (oracle 11g grid) ocr voting 损坏的集群

     windows 环境怎样恢复 (oracle 11g grid) ocr voting 损坏的集群 oracle 11g 以后 ocr 能够放到 asm 磁盘上,而ASM的启动依赖于ocr和vo ...

  8. oracle ebs应用产品安全性-定义访问权限集

    定义 定义访问权限集是一项分配至责任层的可选的安全功能,是对Oracle 11i应用产品弹性域安全性定义的功能扩展,对总帐管理模块的一些内容进行安全性定义和权限分配的集合,以控制不同的责任对一些内容的 ...

  9. 查询返回JSON数据结果集

    查询返回JSON数据结果集 设计目标: 1)一次性可以返回N个数据表的JSON数据 2)跨数据库引擎 { "tables": [ { "cols": [ { & ...

随机推荐

  1. [转载]Java学习这七年

    从2005那会做自动化测试开始接触Java开始,至今近7年.今天正好项目结束,趁机整理下思路,确定后续方向. 前三个年头基本上集中于Java基础的学习,包括设计模式,从完全不懂,到看的懂但似乎又不懂, ...

  2. POJ1013Counterfeit Dollar

    这个题主要是判断硬币真假,可能轻可能重,称三次,要输出哪枚是假币,还要输出是重的还是轻的,所以最主要的是标记变量 #include<cstdio> #include<cstring& ...

  3. Android 近百个项目的源代码

    Android 近百个项目的源代码 Android PDF 阅读器 http://sourceforge.net/projects/andpdf/files/个人记账工具 OnMyMeans http ...

  4. linux入门教程(六) Linux文件与目录管理

    在linux中什么是一个文件的路径呢,说白了就是这个文件存在的地方,例如在上一章提到的/root/.ssh/authorized_keys 这就是一个文件的路径.如果你告诉系统这个文件的路径,那么系统 ...

  5. lintcode 中等题:partition array 数组划分

    题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...

  6. 【Linux高频命令专题(16)】less

    概述 less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向 ...

  7. spring @bean注解

    1.@bean注解用于注册一个bean到 到ioc容器中.类似于@component注解 2.@configure注解,相当于指明这个类是配置文件 3.@bean还可以指定initMethod,des ...

  8. Java开发--操作MongoDB

    http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过前一篇文章我们 ...

  9. TCL语言笔记:TCL中的String命令

    一.介绍 字符串是 Tcl 中的基本数据类型,所以有大量的字符串操作命令.一个比较重要的问题就是模式匹配,通过模式匹配将字符串与指定的模式(格式)相匹配来进行字符串的比较.搜索等操作. 二.strin ...

  10. 252. Meeting Rooms

    题目: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] ...