Home >Database >Mysql Tutorial >Oracle包和REF CURSOR

Oracle包和REF CURSOR

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-07 16:59:351148browse

首先,需要重新整理一下相关概念,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;

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn