PL/SQL 总结(3)

使用游标

1)显示游标:

CURSOR name_cursor IS select statement;

2)打开游标:

OPEN name_cursor;

3)提取游标

FETCH name_cursor INTO variable1,variable2.............

4)关闭游标

CLOSE name_cursor;

显示游标的属性:

%ISOPEN:显示游标是否打开

%FOUND:是否从结果集中取到数据

%NOTFOUND:是否未从结果集中取到数据

%ROWCOUNT:已经取到的数据,不是说集合中间有多少数据,请这里注意;

DECLARE
CURSOR a_cursor IS SELECT id,name from test1;
v_id test1.id%TYPE;
v_name test1.name%TYPE;
BEGIN
OPEN a_cursor;
FETCH a_cursor INTO v_id,v_name;
dbms_output.put_line(v_id);
dbms_output.put_line(v_name);
CLOSE a_cursor;
END;

使用游标更新或者删除数据:

如果想通过游标更新或者删除数据的话,那么在定义游标的时候必须指定 FOR UPDATE

如下:

CURSOR my_cursor IS SELECT * FROM test1 FOR UPDATE;

UPDATE table_name SET column=xx WHERE CURRENT OF name_cursor;

DELETE table_name WHERE CURRENT OF name_cursor;

必须指定WHERE CURRENT OF name_current;

使用例外:

EXCEPTION

WHEN  e_name1 or e_name2 THEN

statement1;

WHEN 2_name3 THEN

statement2;

ELSE

statement3;

WHEN OTHERS THEN

statement4;

其中自定义异常是这样的:


 DECLARE
 e_name EXCEPTION;
 BEGIN
 RAISE e_name;
 EXCEPTION
 WHEN e_name THEN
 dbms_output.put_line('异常抛出');
 END;

使用复合数据:

TYPE my_record_type IS RECORD

DECLARE
TYPE my_record_type IS RECORD(
id test1.id%TYPE,
name test1.name%TYPE
);
r1 my_record_type;
BEGIN
SELECT id,name INTO r1 FROM test1 WHERE id=1;      
dbms_output.put_line(r1.id || r1.name);
END;


 DECLARE
 TYPE my_record_type IS RECORD(
 id test1.id%TYPE,
 name test1.name%TYPE
 );
 r1 test1%ROWTYPE;
 BEGIN
 SELECT * INTO r1 FROM test1 WHERE id=1;  

 dbms_output.put_line(r1.id || r1.name);
 END;
 /

使用PL/SQl表:

DECLARE
TYPE my_table_type IS TABLE OF NUMBER(2,0)
INDEX BY BINARY_INTEGER;
name_table my_table_type;
BEGIN
select id BULK COLLECT INTO name_table from test1;
dbms_output.put_line(name_table(1));
End;

使用PL/SQL记录表:

 DECLARE
 TYPE my_table_type IS TABLE OF test1%ROWTYPE
 INDEX BY BINARY_INTEGER;
 name_table my_table_type;
 BEGIN
 select * BULK COLLECT INTO name_table from test1;
 dbms_output.put_line(name_table(1).name);
 End;

DECLARE
TYPE my_table_type IS TABLE OF test1%ROWTYPE
INDEX BY BINARY_INTEGER;
name_table my_table_type;
BEGIN
select * BULK COLLECT INTO name_table from test1;   --count可以得到这个表的长度
FOR i in 1..name_table.count LOOP
dbms_output.put_line(name_table(i).name);
END LOOP;
End;

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/turkeyzhou/archive/2008/05/14/2443676.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值