PLSQL光标和包使用

1.光标

        光标(游标)是一个结果集的概念,当需要返回的查询结果是一个集合时不能使用into将查询结果返回给变量,这时需要使用到光标的概念。

光标的语法   

   CURSOR cursorName[(参数名,参数类型...)]
   IS SELECT语句;
   例:CURSOR C1 IS SELECT * FROM TABLE1;

光标的使用     

   OPEN C1;
   FETCH C1 INTO PENAME;//取第一行到变量中,指针下移
   CLOSE C1;
   
   例:
    DECLARE 
	--定义一个光标
	CURSOR C1 IS SELECT PARAM1,PARAM2 FROM TABLE1;
	--为光标定义一个结构体或定义对应变量
	VALUE1 TABLE1.PARAM1%TYPE;
	VALUE2 TABLE1.PARAM2%TYPE;
	BEGIN 
	---打开光标
	OPEN C1;
	   LOOP
	    EXIT WHEN C1%NOTFOUND;
		FETCH C1 INTO VALUE1,VALUE2;
		--打印
		----
	    END LOOP;
	CLOSE C1;
	END;

光标的属性

	%FOUND、%NOTFOUND  --判断是否取数结束
	%ISOPEN --判断光标是否打开
	%ROWCOUNT--影响的行数

带参数的光标

   CURSOR C1(dno NUMBER) IS SELECT * FROM TABLE1 WHERE TABLE1.DNO=dno;
   OPEN C1(100);
   ----
   CLOSE C1;

2. ORACLE中的包

    oracle中的包由两部分组成:包规范和包体

包定义

   应用程序的接口,声明包内的数据类型、变量、常亮、游标、子程序及异常处理等,这些元素为包的公有元素。

   CREATE [OR REPLACE] PACKAGE PACKAGE_NAME
   IS/AS
   [公有数据类型定义]
   [公有游标声明]
   [公有变量,常亮声明]
   [公有子程序声明]
   END [PACKAGE_NAME];

包主体

   包定义部分的具体实现及声明的私有变量

   CREATE [OR REPLACE] PACKAGE BODY PACKAGE_NAME
   IS/AS
   [私有数据类型定义]
   [私有游标声明]
   [私有变量,常亮声明]
   BEGIN 
      //执行部分
   END [PACKAGE_NAME];

 包的使用
      
   //包定义-----------------------------------------
   CREATE OR REPLACE PACKAGE PACKAGE1
   AS
   --定义了一个结构体
     TYPE STU IS INFO(
	   PARAM1 TABLE1.PARAM1%TYPE,
	   PARAM2 TABLE1.PARAM2%TYPE
	 );
   --定义一个光标
   TYPE C1 IS REF CURSOR;
   --定一个函数
   FUNCTION FUN1(NUM1 NUMBER,NUM2 NUMBER) RETURN NUMBER;
   --定义一个存储过程
   PROCEDURE RETURNLIST(NOD IN VARCHAR2,RE_LIST OUT C1)
   END;
  
  //包体---------------------------------------------
   CREATE OR REPLACE PACKAGE BODY PACKAGE1
   AS
   --其他定义
   --实现函数
   FUNCTION FUN1(NUM1 NUMBER,NUM2 NUMBER) RETURN NUMBER;
    AS
	SUM NUMBER;
	BEGIN
	  SUM:=NUM1+NUM2;
	  RETURN SUM;
	END;
	
   --实现存储过程
   PROCEDURE RETURNLIST(NOD IN VARCHAR2,RE_LIST OUT C1)
   AS
     STRUCTURE1 STU;
   BEGIN 
   OPEN RE_LIST FOR SELECT PARAM1,PARAM2 FROM TABLE1 WHERE TABLE1.NOD=NOD;
   --如果已经在过程中遍历了游标,在使用这个过程块时将返回为空
   LOOP
      FETCH RE_LIST INTO STRUCTURE1;
	  EXIT WHEN RE_LIST%NOTFOUND;
	  //打印
	  dbms_output.put_line('参数1'||STRUCTURE1.PARAM1);
   END LOOP;
   END;
   
   //调用包------------------------------------------
   DECLARE
     RE_LIST_RE  PACKAGE1.C1;--C1是一种类型
     STRUCTURE1 PACKAGE1.STU;
     NUM NUMBER;
   BEGIN
   --使用包中方法
   SELECT PACKAGE1.FUN1(1,2) INTO NUM FROM TABLE1;
   //打印--求和
   dbms_output.put_line('和NUM'||NUM);
   --使用存储过程
   PACKAGE1.RETURNLIST('HI',RE_LIST_RE);
   LOOP
   FETCH RE_LIST_RE INTO STRUCTURE1;
   EXIT WHEN RE_LIST_RE%NOTFOUND;
   //打印--取出的值
   dbms_output.put_line('PARAM1='||STRUCTURE1.PARAM1);
   END LOOP;
END;




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值