Oracle 起步日记(8)——游标
2012-02-11 16:58
405 查看
当在PL/SQL块中执行DML和单行SELECT INTO 语句时,Oracle会分配隐含游标。为了处理SELECT语句返回的多行数据,需要使用显式游标
何谓SELECT INTO
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
语法
1、把所有的列插入新表:
SELECT *INTO new_table_name [IN externaldatabase] FROM old_tablename
2、只把希望的列插入新表:
SELECT column_name(s)INTO new_table_name [IN externaldatabase] FROM old_tablename
显式游标专门用于处理SELECT语句返回的多行数据,其包含四个属性——%ISOPEN,%FOUNT,%NOTFOUNT,%ROWCOUNT
当使用显式游标时,必须经历定义游标,打开游标,提取数据,关闭游标四个阶段
1) 标量变量接收游标数据
DECLARE
CURSOR student_cursor IS——定义游标
SELECT id,name FROM student WHERE id = &number;
v_namestudent.name%TYPE;
v_idstudent.id%TYPE;
BEGIN
OPEN student_cursor;——打开游标
LOOP
FETCH student_cursor INTO v_id,v_name;——提取数据
//这里不可写v_name,v_id,必须和CURSOR中定义的SELECT的顺序一致
EXIT WHEN student_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(‘学号:’ || v_id || ‘姓名:’ || v_name);
END LOOP;
CLOSE student_cursor;——关闭游标
END;
2) 记录变量接受游标数据
DECLARE
CURSOR student_cursor_define IS
SELECT name,idFROM student WHERE id > 1;
student_cursorstudent_cursor_define%ROWTYPE;
BEGIN
OPENstudent_cursor_define;
LOOP
FETCHstudent_cursor_define INTO student_cursor;
EXITWHENstudent_cursor_define%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(‘学号:’ || student_cursor.id || ‘姓名:’ ||student_cursorname);
ENDLOOP;
CLOSEstudent_cursor_define;
END;
3) 更新游标行
DECLARE
CURSOR student_cursor IS
SELECT name,id FROM studentFOR UPDATE;
BEGIN
FOR num IN student_cursor LOOP
IF num.id = 25 THEN
DBMS_OUTPUT.PUT_LINE('姓名:' || num.name || '原学号:' || num.id);
UPDATE student SET id = 5231600 +id WHERE CURRENT OF student_cursor;
END IF;
END LOOP;
CLOSE student_cursor;
END;
4) 批量提取
Oracle 9i后可以使用FETCH…BULK COLLECT提取所有数据
DECLARE
CURSOR student_cursor IS
SELECT * FROM student WHERE id = 5231625;
TYPE student_TABLE_TYPE IS TABLE OF student%ROWTYPE;
student_tablestudent_TABLE_TYPE;
BEGIN
OPEN student_cursor;
FETCH student_cursor BULK COLLECT INTO student_table;
CLOSE student_cursor;
FOR i IN 1..student_table.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('学号:' ||student_table(i).id || '姓名:' ||student_table(i).name);
END LOOP;
END;
何谓SELECT INTO
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
语法
1、把所有的列插入新表:
SELECT *INTO new_table_name [IN externaldatabase] FROM old_tablename
2、只把希望的列插入新表:
SELECT column_name(s)INTO new_table_name [IN externaldatabase] FROM old_tablename
显式游标专门用于处理SELECT语句返回的多行数据,其包含四个属性——%ISOPEN,%FOUNT,%NOTFOUNT,%ROWCOUNT
当使用显式游标时,必须经历定义游标,打开游标,提取数据,关闭游标四个阶段
1) 标量变量接收游标数据
DECLARE
CURSOR student_cursor IS——定义游标
SELECT id,name FROM student WHERE id = &number;
v_namestudent.name%TYPE;
v_idstudent.id%TYPE;
BEGIN
OPEN student_cursor;——打开游标
LOOP
FETCH student_cursor INTO v_id,v_name;——提取数据
//这里不可写v_name,v_id,必须和CURSOR中定义的SELECT的顺序一致
EXIT WHEN student_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(‘学号:’ || v_id || ‘姓名:’ || v_name);
END LOOP;
CLOSE student_cursor;——关闭游标
END;
2) 记录变量接受游标数据
DECLARE
CURSOR student_cursor_define IS
SELECT name,idFROM student WHERE id > 1;
student_cursorstudent_cursor_define%ROWTYPE;
BEGIN
OPENstudent_cursor_define;
LOOP
FETCHstudent_cursor_define INTO student_cursor;
EXITWHENstudent_cursor_define%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(‘学号:’ || student_cursor.id || ‘姓名:’ ||student_cursorname);
ENDLOOP;
CLOSEstudent_cursor_define;
END;
3) 更新游标行
DECLARE
CURSOR student_cursor IS
SELECT name,id FROM studentFOR UPDATE;
BEGIN
FOR num IN student_cursor LOOP
IF num.id = 25 THEN
DBMS_OUTPUT.PUT_LINE('姓名:' || num.name || '原学号:' || num.id);
UPDATE student SET id = 5231600 +id WHERE CURRENT OF student_cursor;
END IF;
END LOOP;
CLOSE student_cursor;
END;
4) 批量提取
Oracle 9i后可以使用FETCH…BULK COLLECT提取所有数据
DECLARE
CURSOR student_cursor IS
SELECT * FROM student WHERE id = 5231625;
TYPE student_TABLE_TYPE IS TABLE OF student%ROWTYPE;
student_tablestudent_TABLE_TYPE;
BEGIN
OPEN student_cursor;
FETCH student_cursor BULK COLLECT INTO student_table;
CLOSE student_cursor;
FOR i IN 1..student_table.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('学号:' ||student_table(i).id || '姓名:' ||student_table(i).name);
END LOOP;
END;
相关文章推荐
- Oracle 起步日记(11)——文件检测
- Oracle 起步日记(12)——对象监测
- Oracle 起步日记(16)——控制文件管理
- Oracle 起步日记(17)——日志文件管理
- Oracle 起步日记(6)——存储过程
- Oracle 起步日记(18)——表空间调整
- Oracle 起步日记(2)——表空间管理
- Oracle 起步日记(9)——事务与并发控制
- Oracle 起步日记(21)——物理调优、表空间改进
- Oracle 起步日记(10)——进程检测
- Oracle 起步日记(13)——冷备份与恢复
- Oracle 起步日记(22)——SQL调优
- Oracle 起步日记(5)——PL/SQL语句
- Oracle 起步日记(1)——安装
- Oracle 起步日记(19)——安全管理、角色管理
- Oracle 起步日记(3)——用户管理、权限管理、序列
- Oracle 起步日记(7)——触发器
- Oracle 起步日记(4)——数据查询之去重、字符串连接、子查询
- Oracle 起步日记(14)——EXP/IMP导入导出
- Oracle 起步日记(15)——参数文件管理