您的位置:首页 > 数据库 > Oracle

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: