oracle ref cursor return,Oracle包和REF CURSOR

首先,需要重新整理一下相关概念,oracle数据库中函数的作用,是只能被别人调用,存储过程可以单独执行,并且可以调用存储过程,

首先,需要重新整理一下相关概念,Oracle数据库中函数的作用,是只能被别人调用,存储过程可以单独执行,并且可以调用存储过程,而包的作用包可以将任何出现在块声明的语句 ( 过程 , 函数 , 游标 , 游标 , 类型 , 变量 ) 放于包中 , 相当于一个容器 . 将声明语句放入包中的好处是 : 用户可以从其他 PL/SQL 块中对其进行引用 , 因此包为 PL/SQL 提供了全局变量,包分为包头和包体,包头先编译通过后才能编译包体。

包头的创建:

1) 包头 :

语法格式 :

CREATE OR REPLACE PACKAGE package_name /* 包头名称 */

IS|AS

pl/sql_package_spec /* 定义过程 , 函数以及返回类型 , 变量 , 常量及数据类型定义 */

定义包头应当遵循以下原则 :

1) 包元素位置可以任意安排 . 然而在声明部分 , 对象必须在引用前进行声明 .

2) 包头可以不对任何类型的元素进行说明 . 例如 , 包头可以只带过程和函数说明语句 , 而不声明任何异常和类型 .

3) 对过程和函数的任何声明都必须只对子程序和其参数进行描述 , 不能有任何代码的说明 , 代码的实现只能在包体中出现 . 它不同于块声明 , 在块声明中 , 过程和函数的代码可同时出现在声明部分 .

2. 包体 :

语法格式 :

CREATE OR REPLACE PACKAGE BODY package_name/* 包名必须与包头的包名一致 */

IS | AS

pl/sql_package_body /* 游标 , 函数 , 过程的具体定义 */

包体是与包头相互独立的 , 包体只能在包头完成编译后才能进行编译 . 包体中带有包头中描述的子程序的具体实现的代码段 . 除此之外 , 包体还可以包括具有包体人全句属性的附加声明部分 , 但这些附加声明对于包头是不见的 .

Demo:

****************

*包

****************

create or replace package mypack

as

type mytype is ref cursor return emp%rowtype; --声明REF游标

function myemp(dno number) return mytype;

end;

****************

*body

****************

create or replace package body mypack

as

function myemp(dno number) return mytype

as

eee mytype;--声明Ref 游标类型变量

begin

open eee for select * from emp where deptno=dno;

return eee;

end myemp;

end mypack;

分析:

在包头中出现了type mytype is ref cursor return emp%rowtype;

里面有一个REF CURSOR的概念, REF游标就是动态关联结果集的临时对象。即在运行的时候动态决定执行查询,他的主要作用就是实现在程序间传递结果集的功能

①声明REF游标

⑴强类型REF游标:指定retrun type,REF 游标变量的类型必须和return type一致。

语法:Type REF游标名 IS ref cursor Return 结果集返回记录类型;

⑵弱类型REF游标:不指定return type,,能和任何类型的CURSOR变量匹配,用于获取任何结果集。

语法:Type REF游标名 IS ref cursor ;

②声明Ref 游标类型变量;

语法:变量名 已声明Ref 游标类型;

③打开REF游标,关联结果集 ;

语法:Open Ref 游标类型变量 For 查询语句返回结果集;

④获取记录,操作记录;

语法:fetch REF游标名 InTo 临时记录类型变量或属性类型变量列表;

⑤关闭游标,完全释放资源;

语法:Close REF游标名;

附上测试代码:

create or replace package mypack

as

type mytype is ref cursor return emp%rowtype;

function myemp(dno number) return mytype;

end;

create or replace package body mypack

as

function myemp(dno number) return mytype

as

eee mytype;

begin

open eee for select * from emp where deptno=dno;

return eee;

end myemp;

end mypack;

drop table emp;

create table emp

(

DEPTNO number,

COMM number,

SAL number

);

Delete from emp Where deptno=10;

Delete from emp Where deptno=11;

Insert Into emp (deptno,comm,sal) Values (10,1,2);

Insert Into emp (deptno,comm,sal) Values (11,2,3);

Commit;

logo.gif

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值