第五天、PL/SQL高级应用

5.PL/SQL高级应用

1.游标的设计开发
什么是游标,为什么用游标,怎么使用游标
游标是一种PL/SQL控制结构,可以对SQL语句的处理进行显式控制,便于对表的行数据条进行处理
游标分为显示和隐式两种
游标的属性:%FOUND,%ISOPEN,%NOTFOUND,%ROWCOUNT
在SQLPLUS下:
例;
DECLARE
CURSOR mycur IS
SELECT * FROM BOOKS;
myrecord BOOKS%ROWTYPE;
BEGIN
OPEN mycur;   打开游标
PETCH mycur INTO myrecord;  把游标存储到变量中。
WHILE mycur%FOUND LOOP   %found表示有数据可取
DBMS_OUTPUT.PUT_LINE(myrecord.books_id||','||myrecord.books_name);
PETCH mycur INTO myrecord;  
END LOOP;
CLOSE mycur;    关闭游标
END;

save c:\text.txt

例:利用游标参数
DECLARE
CURSOR cur_para(id varchar2) IS     这里的参数不加长度
SELECT BOOKS_NAME FROM BOOKS WHERE BOOKS_ID=id;
t_name books.books_name%TYPE;定义一个T_NAME变量和后面的一个类型
BEGIN
OPEN cur_para('001');
LOOP
PETCH cur_para INTO t_name;
EXIT WHEN cur_para%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(t_name);
END LOOP;
CLOSE cur_para;
END;
/

%ISOPEN  游标打开的时候为TRUE,关闭的时候为FALSE。
%ROWCOUNT 从游标中取出的的总数 

当然也可以用游标来修改数据
例:
DECLARE
CURSOR cur IS
SELECT name FROM deptment FOR UPDATE;
text varchar2(10);
BEGIN
OPEN cur;
PETCH cur INTO text;
WHILE cur%FOUND LOOP
UPDATE deptment SET name=name||'_t' WHERE CURRENT OF cur;
PETCH cur INTO text;
END LOOP;
CLOSE cur;
END;
/

隐式游标的使用
BEGIN
FOR cur IN(SELECT name FROM deptment) LOOP
DBMS_OUTPUT.PUT_LINE(cur.name);
END LOOP;
END;
/
缺点:每次都得编译,不能存储到数据库中。

2.存储过程
存储过程的创建,参数的使用,存储过程的执行
创建语法:
CREATE [OR REPLACE] PROCEDURE procedurename
[(param1[{IN|OUT|IN OUT}]param1_type
[,(param2[{IN|OUT|IN OUT}]param2_type
....
IS|AS
....
BEGIN
Proc_body;
END;
/
例:
CREATE OR REPLACE PROCEDURE myproc(id varchar2)
IS
name varchar2(10);
BEGIN
SELECT books_name INTO name FROM books WHERE books_id=id;
DBMS_OUTPUT.PUT_LINE(name);
END myproc;    myproc过程名可以不写
/

执行存储过程
DECLARE
tid varchar2(10);
BEGIN
tid:='001';
myproc(tid);   调用函数,存储过程
END;
/

BEGIN
myproc('001');  这样也可以调用
END;
/

EXECUTE myproc('001');  这样也可以调用存储过程,不能调用带输出参数的存储过程

CREATE OR REPLACE PROCEDURE myproc2(id varchar2,name out varchar2)   name是输出参数
IS
BEGIN
SELECT books_name INTO name FROM books WHERE books_id=id;
END;
/

DECLARE
tid varchar2(10);
tname varchar2(10);
BEGIN
tid:='001';
myproc2(tid,tname);
END;
/

3.存储函数的设计
函数的创建,参数的使用,函数的调用

 

4.包的设计与应用
什么是包,包的创建及使用

 

原文地址:https://www.cnblogs.com/astar/p/1122136.html