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;