`
- 浏览:
98098 次
- 性别:
- 来自:
广州
-
-
- /*
- 显示游标 多行
-
隐含游标 数据操纵语言 DML 和单行select into语句
-
- 1.定义游标
-
指定游标所对应的select结果集语句
-
CURSOR cursor_name IS select_statement;
- select_statement:查询语句
- 2.打开游标
-
OPEN cursor_name;
- 执行游标所对应的select_statement,将结果暂时存放在游标结果集中
- 3.提取数据
-
使用fetch语句提取游标数据,fetch每次只能提取一行;fetch..bulk collect into可以提取多行
-
FETCH cursor_name into variable...;
- variable 接受游标数据的变量
-
FETCH cursor_name BULK COLLECT INTO collection...;
- collection 接收游标数据的集合变量
- 4.关闭游标
- 提取完数据,关闭游标,释放结果集
-
CLOSE cursor_name;
-
-
-
- *游标属性
- cursor_name%ISOPEN 游标是否已打开
-
cursor_name%FOUND FETCH语句执行后,用来判断是否有数据被提取
- cursor_name%NOTFOUND 同上
-
cursor_name%ROWCOUNT 目前已经fetch的行数
-
- */
-
-
DECLARE
- v_name varchar2(30);
-
BEGIN
-
select ename into v_name from emp where empno = 7788;
-
CASE
-
WHEN SQL%FOUND THEN
-
dbms_output.put_line('隐身游标的行数肯定是:'||SQL%ROWCOUNT||',查询的结果:'||v_name);
-
-
END CASE;
-
END;
-
-
-
-
-
DECLARE
-
CURSOR emp_cs is select ename,job from emp;
- v_name emp.ename%type;
- v_job emp.job%type;
-
BEGIN
-
OPEN emp_cs;
-
LOOP
-
FETCH emp_cs INTO v_name,v_job;
-
EXIT WHEN emp_cs%NOTFOUND;
-
dbms_output.put_line(emp_cs%ROWCOUNT||'--'||v_name||'--'||v_job);
-
END LOOP;
-
CLOSE emp_cs;
-
END;
-
-
-
DECLARE
-
-
TYPE v_table_type IS TABLE OF VARCHAR2(30);
- name_table v_table_type;
- job_table v_table_type;
-
CURSOR emp_cs IS select ename,job from emp;
-
BEGIN
-
OPEN emp_cs;
-
FETCH emp_cs BULK COLLECT INTO name_table,job_table;
-
FOR i IN 1..name_table.count LOOP
-
dbms_output.put_line(name_table(i)||'--'||job_table(i));
-
END LOOP;
-
CLOSE emp_cs;
-
END;
-
-
-
DECLARE
-
type v_table_type IS TABLE OF int;
- no_tab v_table_type;
-
pageNo int :=5;
-
nums int:=0;
-
CURSOR emp_cs IS select empno from emp;
-
BEGIN
-
-
IF NOT emp_cs%ISOPEN THEN
-
OPEN emp_cs;
-
END IF;
-
LOOP
-
FETCH emp_cs BULK COLLECT INTO no_tab LIMIT pageNo;
-
-
FOR I IN 1..(emp_cs%ROWCOUNT - nums) LOOP
- dbms_output.put_line(no_tab(i));
-
END LOOP;
- dbms_output.new_line;
-
nums := emp_cs%ROWCOUNT;
- /*
-
-
- */
-
EXIT WHEN emp_cs%NOTFOUND;
-
END LOOP;
-
CLOSE emp_cs;
-
END;
-
-
-
-
DECLARE
-
CURSOR emp_cs IS select ename,job from emp;
-
v_record emp_cs%ROWTYPE;
-
BEGIN
-
OPEN emp_cs;
- LOOP
-
FETCH emp_cs INTO v_record;
-
EXIT WHEN emp_cs%NOTFOUND;
-
dbms_output.put_line(v_record.ename||'--'||v_record.job);
-
END LOOP;
-
CLOSE emp_cs;
-
END;
-
-
-
-
- /*
-
CURSOR cursor_name(parametr_name datatype...) IS select_statement;
- *参数只能定义类型,不能定义长度,
- */
-
-
DECLARE
-
CURSOR emp_cs(param1 varchar2) IS select ename from emp where job =param1;
- v_name emp.ename%type;
-
v_job varchar2(30) := '&job';
-
BEGIN
-
OPEN emp_cs(v_job);
- LOOP
-
FETCH emp_cs INTO v_name;
-
EXIT WHEN emp_cs%NOTFOUND;
- dbms_output.put_line(v_name);
-
END LOOP;
-
CLOSE emp_cs;
-
END;
-
-
-
-
- /*
- 游标不仅可以查询数据,也可以修改数据,由于游标是操作的多条数据更新,为
- 保证事物的原子性,我也不知道怎么称呼,反正就是防止游标中的数据行在修改的过程中
-
有其它的事务修改这些列 要使用FOR UPDATE 子句
- 如:游标中有5条数据,你这时正执行修改第3条数据,而这时另一个事务修改了第4条数据。
- 而游标是临时缓存结果集,4的修改就不会被看到。这样就乱套了
-
-
CURSOR cursor_name(param datatype) IS
-
select_statement FOR UPDATE [OF column_reference][NOWAIT];
-
-
FOR UPDATE在游标结果集数据行上加行共享锁,防止其它用户在相应
- 行上执行DML操作。
- */
-
DECLARE
-
CURSOR emp_cs IS select comm from emp FOR UPDATE;
- v_comm number(7,2);
-
BEGIN
-
OPEN emp_cs;
- LOOP
-
FETCH emp_cs INTO v_comm;
-
EXIT WHEN emp_cs%NOTFOUND;
-
IF v_comm is null THEN
-
UPDATE emp SET comm=1 WHERE CURRENT OF emp_cs;
-
END IF;
-
END LOOP;
-
CLOSE emp_cs;
-
END;
-
commit;
-
- /*
-
游标for循环
-
简化了对游标的处理,使用游标for循环时,oracle会隐含的打开游标、
- 提取数据并关闭游标
- */
-
-
DECLARE
-
CURSOR emp_cs IS select ename,job from emp;
-
BEGIN
-
FOR emp_record IN emp_cs LOOP
-
dbms_output.put_line(emp_cs%ROWCOUNT||'-'||emp_record.ename);
-
END LOOP;
-
END;
-
-
-
-
BEGIN
-
FOR emp_record IN (select ename,job from emp) LOOP
- dbms_output.put_line(emp_record.ename);
-
END LOOP;
-
END;
-
-
- /*
- 使用游标变量
-
使用显示游标时,需要在定义部分指定所对应的静态select语句;
-
当使用游标变量时,就可在打开游标变量时指定其所对应的select语句。
- 定义游标变量
-
TYPE ref_type IS REF CURSOR[RETURN return_type];
- cursor_var ref_type;
- */
-
-
DECLARE
-
TYPE emp_cursor_type IS REF CURSOR;
-
emp_cs emp_cursor_type;
- emp_record emp%ROWTYPE;
-
BEGIN
-
OPEN emp_cs FOR select * from emp;
- LOOP
-
FETCH emp_cs INTO emp_record;
-
EXIT WHEN emp_cs%NOTFOUND;
- dbms_output.put_line(emp_record.ename);
-
END LOOP;
-
CLOSE emp_cs;
-
END;
-
-
-
DECLARE
-
TYPE v_record_type IS RECORD(
-
name varchar2(10),sal number
- );
-
TYPE v_cursor_type IS REF CURSOR RETURN v_record_type;
-
- v_record v_record_type;
- v_cursor v_cursor_type;
-
BEGIN
-
OPEN v_cursor FOR select ename,sal from emp where deptno=10;
- LOOP
-
FETCH v_cursor INTO v_record;
-
EXIT WHEN v_cursor%NOTFOUND;
-
dbms_output.put_line(v_record.name||'-'||v_record.sal);
-
END LOOP;
-
CLOSE v_cursor;
-
END;
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
ORACLE 游标使用示例,给大家可以共享一下。
oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结
Oracle游标使用大全 适合初学者,非常不错.PDF
oracle游标使用大全,详细描述了如何使用游标,创建游标等等
Oracle游标使用方法及语法大全
Oracle游标使用方法及语法大全.doc
详细的oracle游标用法,简单易懂,是学习游标的好材料
详细介绍了 oracle的游标使用 及 实例
简单的oracle游标使用小例子~~ 一份文档,实验用的。
Oracle入门--Oracle游标使用! 值得下载看看!资源免费,大家分享!!
oracle游标使用大全,其中有很多例子,有助于大家理解,希望对初学者有帮助
Oracle 游标使用大全
Oracle 游标使用大全.txt Oracle 游标使用大全.txt
游标是存储过程最基本的要会的,用于访问 ORACLE 数据库的 DDL 和 TCL 语
该资源系本人培训期间的关于ORCL 游标所有实用案例,在此共享希望对大家学习有所帮助