Oracle 起步日记(8)——游标

来源:互联网 发布:开ktv 知乎 编辑:程序博客网 时间:2024/04/28 03:33

当在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;

 

原创粉丝点击