隐式游标:
1.无论何时SQL语句执行,当改SQL语句不存在显式游标时,任何特定PL/SQL语句块都会产生一个隐式游标。
2.游标自动与每个DMLyuju (UPDATE,INSERT,DELETE)建立关联。
3.所有UPDATE 和 DELETE 语句都有标识被当前操作所影响数据行集合的游标。
4.INSERT 语句需要存储位置来接收即将插入数据库的数据。
5.最近一次呗打开的游标成为 SQL 游标。
处理隐式游标时,oracle 会自动执行OPEN,FETCH CLOSE 操作。
SET SERVEROUPUTT ON BEGIN UPDATE student SET xxxx WHERE xxxx; DBMS_OUTPUT.LINE( SQL%ROWCOUNT); END;
显式游标:
1.声明游标。这会在内存中建立游标的初始化环境。
2.打开游标。打开被声明的游标,并分配内存。
3.检索游标。被声明和打开的游标能够检索数据。
4.关闭游标。使用后的游标必须被关闭,以释放所有分配的内存。
声明游标:
CURSOR cursor_name IS SELECT_statement;
声明后游标在获取数据时需要定义一个暂时保存数据的变量,通常使用 记录(RECORD)实现,PL/SQL 支持三种记录,基于表的,基于游标的,用户自定义的。
前两种都使用同样一种格式声明。
record_name [table_name |cursor_name ] %ROWTYPE;
打开游标:
打开游标是下面4个动作会自动发生:
1.会检索WHERE 字句中的变量(包括绑定变量)。
2.基于变量的值,决定活跃的数据集,PL/SQL引擎会执行针对该游标的查询。只在游标打开时检索变量。
3.PL/SQL 引擎标识活跃集的数据——就是满足WHERE子句条件,来至于所有涉及表的数据行。
4.把活跃数据集的指针设置为第一行数据。
OPEN cursor_name;
检索数据:
1.FETCH 命令用于活跃集数据中,每次检索一行数据。通常在一个循环中完成这个任务的。然后把活跃集中每行数据保存到相应的变量或者PL/SQL中,连续对每行数据执行这种操作。
2.在每个FETCH豫剧之后,活跃数据集指针继续前一到下一个数据行。因此,每个eFETCH都会返回活跃数据集中连续的数据行。直到获取整个数据集。最后一个FETCH 语句不会给输出变量赋值,他仍旧保留原来的值。
LOOP FETCH cursor_name INTO record_name; EXIT WHEN cursor_name%NOTFOUND; ; END LOOP;
FETCH 语句的写法。
FETCH cursor_name INTO record_name; or FETCH cursor_name INTO variables;
关闭游标:
CLOSE cursor_name;
游标的属性:
%NOTFOUND , %FOUND , %ROWCOUNT , %ISOPEN
游标FOR循环
可以简化游标的4个步骤。
DECLARE CURSOR cursor_name IS SELECT_statement; BEGIN FOR record_name IN cursor_name LOOP NULL; END LOOP; END;
上面的语句包括了游标的 OPEN FETCH CLOSE 步骤,其中 record_name 自动获取游标的属性,不需要另外定义,当数据读取完毕后能够自动关闭游标。