`
121059457
  • 浏览: 23515 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习笔记:15使用游标

阅读更多



15-1:使用标量变量接收游标数据
	DECLARE
	  CURSOR emp_cursor IS
	    SELECT ename,job,sal FROM emp WHERE deptno=&dno;
	  v_ename emp.ename%TYPE;
	  v_sal emp.sal%TYPE;
	  v_job emp.job%TYPE;
	BEGIN
	  OPEN emp_cursor;
	  LOOP
	    FETCH emp_cursor INTO v_ename,v_job,v_sal;
	    EXIT WHEN emp_cursor%NOTFOUND;
	    dbms_output.put_line('姓名:'||v_ename||',岗位:'||v_job||',工资:'||v_sal);
	  END LOOP;
	  CLOSE emp_cursor;
	END;
	/
15-2:使用pl/sql纪录变量接收游标数据
	DECLARE
	  CURSOR emp_cursor IS
	    SELECT ename,sal FROM emp ORDER BY sal DESC;
	  emp_record emp_cursor%ROWTYPE;
	BEGIN
	  OPEN emp_cursor;
	  LOOP
	    FETCH emp_cursor INTO emp_record;
	    EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%ROWCOUNT>&n;
	    dbms_output.put_line('姓名:'||emp_record.ename||
	     ',工资:'||emp_record.sal);
	  END LOOP;
	  CLOSE emp_cursor;
	END;
	/
15-3:使用pl/sql集合变量接收游标数据
	DECLARE
	  CURSOR emp_cursor IS SELECT ename,sal FROM emp
	    WHERE lower(job)=lower('&job');
	  TYPE emp_table_type IS TABLE OF emp_cursor%ROWTYPE
	    INDEX BY BINARY_INTEGER;
	  emp_table emp_table_type;
	  i INT;
	BEGIN
	  OPEN emp_cursor;
	  LOOP
	    i:=emp_cursor%ROWCOUNT+1;
	    FETCH emp_cursor INTO emp_table(i);
	    EXIT WHEN emp_cursor%NOTFOUND;
	    dbms_output.put_line('姓名:'||emp_table(i).ename||
	      ',工资:'||emp_table(i).sal);
	  END LOOP;
	  CLOSE emp_cursor;
	END;
	/
15-4:在游标for循环中引用已定义游标
	DECLARE
	  CURSOR emp_cursor IS SELECT ename,hiredate FROM emp
	    ORDER BY hiredate DESC;
	BEGIN
	  FOR emp_record IN emp_cursor LOOP
	    dbms_output.put_line('姓名:'||emp_record.ename
	      ||',工作日期:'||emp_record.hiredate);
	    EXIT WHEN emp_cursor%ROWCOUNT=&n;
	  END LOOP;
	END;
	/
15-5:在游标for循环中直接引用子查询
	BEGIN
	  FOR emp_record IN (SELECT ename,hiredate,rownum FROM emp
	    ORDER BY hiredate) LOOP
	    dbms_output.put_line('姓名:'||emp_record.ename
	     ||',工作日期:'||emp_record.hiredate);
	    EXIT WHEN emp_record.rownum=&n;
	  END LOOP;
	END;
	/
15-6:参数游标
	DECLARE
	  CURSOR emp_cursor(dno NUMBER) IS
	    SELECT ename,job FROM emp WHERE deptno=dno;
	BEGIN
	  FOR emp_record IN emp_cursor(&dno) LOOP
	    dbms_output.put_line('姓名:'||emp_record.ename
	      ||',岗位:'||emp_record.job);
	  END LOOP;
	END;
	/
15-7:更新游标行
	DECLARE
	  CURSOR emp_cursor IS
	    SELECT ename,sal,deptno FROM emp FOR UPDATE;
	  dno INT:=&no;
	BEGIN
	  FOR emp_record IN emp_cursor LOOP
	    IF emp_record.deptno=dno THEN
	       dbms_output.put_line('姓名:'||emp_record.ename
	        ||',原工资:'||emp_record.sal);
	       UPDATE emp SET sal=sal*1.1 WHERE CURRENT OF emp_cursor;
	    END IF;
	  END LOOP;
	END;
	/
15-8:删除游标行
	DECLARE
	  CURSOR emp_cursor IS
	    SELECT ename FROM emp FOR UPDATE;
	  name VARCHAR2(10):=lower('&name');
	BEGIN
	  FOR emp_record IN emp_cursor LOOP
	    IF lower(emp_record.ename)=name THEN
	       DELETE FROM emp WHERE CURRENT OF emp_cursor;
	    ELSE
	       dbms_output.put_line('姓名:'||emp_record.ename);
	    END IF;
	  END LOOP;
	END;
	/
15-9:使用of子句在特定表上加行共享锁.
	DECLARE
	  CURSOR emp_cursor IS
	    SELECT a.dname,b.ename FROM dept a JOIN emp b
	    ON a.deptno=b.deptno
	    FOR UPDATE OF b.deptno;
	  name VARCHAR2(10):=LOWER('&name');
	BEGIN
	  FOR emp_record IN emp_cursor LOOP
	    IF LOWER(emp_record.dname)=name THEN
	      dbms_output.put_line('姓名:'||emp_record.ename);
	      DELETE FROM emp WHERE CURRENT OF emp_cursor;
	    END IF;
	  END LOOP;
	END;
	/
15-10:使用无返回类型的游标变量
	DECLARE
	  TYPE ref_cursor_type IS REF CURSOR;
	  ref_cursor ref_cursor_type;
	  v1 NUMBER(6);
	  v2 VARCHAR2(10);
	BEGIN
	  OPEN ref_cursor FOR
	    SELECT &col1 col1,&col2 col2 FROM &table WHERE &cond;
	  LOOP
	    FETCH ref_cursor INTO v1,v2;
	    EXIT WHEN ref_cursor%NOTFOUND;
	    dbms_output.put_line('col1='||v1||',col2='||v2);
	  END LOOP;
	  CLOSE ref_cursor;
	END;
	/
15-11:使用有返回类型的游标变量
	DECLARE
	  TYPE emp_cursor_type IS REF CURSOR RETURN emp%ROWTYPE;
	  emp_cursor emp_cursor_type;
	  emp_record emp%ROWTYPE;
	BEGIN
	  OPEN emp_cursor FOR SELECT * FROM emp
	    WHERE deptno=&dno;
	  LOOP
	    FETCH emp_cursor INTO emp_record;
	    EXIT WHEN emp_cursor%NOTFOUND;
	    dbms_output.put_line('姓名:'||emp_record.ename||
	      ',工资:'||emp_record.sal);
	  END LOOP;
	  CLOSE emp_cursor;
	END;
	/
15-12:使用fetch...bulk collect提取所有数据
	DECLARE
	  CURSOR emp_cursor IS
	    SELECT * FROM emp WHERE LOWER(job)=LOWER('&job');
	  TYPE emp_table_type IS TABLE OF emp%ROWTYPE;
	  emp_table emp_table_type;
	BEGIN
	  OPEN emp_cursor;
	  FETCH emp_cursor BULK COLLECT INTO emp_table;
	  CLOSE emp_cursor;
	  FOR i IN 1.. emp_table.COUNT LOOP
	    dbms_output.put_line('姓名:'||emp_table(i).ename
	      ||',工资:'||emp_table(i).sal);
	  END LOOP;
	END;
	/
15-13:使用limit子句限制提取行数
	DECLARE
	  CURSOR emp_cursor IS SELECT * FROM emp;
	  TYPE emp_array_type IS VARRAY(5) OF emp%ROWTYPE;
	  emp_array emp_array_type;
	BEGIN
	  OPEN emp_cursor;
	  LOOP
	    FETCH emp_cursor BULK COLLECT INTO emp_array LIMIT &rows;
	    FOR i IN 1..emp_array.COUNT LOOP
	      dbms_output.put_line('姓名:'||emp_array(i).ename
	        ||',工资:'||emp_array(i).sal);
	    END LOOP;
	    EXIT WHEN emp_cursor%NOTFOUND;
	  END LOOP;
	  CLOSE emp_cursor;
	END;
	/
15-14:使用cursor表达式
	DECLARE
	  CURSOR dept_cursor(no NUMBER) IS
	     SELECT a.dname,CURSOR(SELECT * FROM emp
	     WHERE deptno=a.deptno)
	     FROM dept a WHERE a.deptno=no;
	  TYPE ref_cursor_type IS REF CURSOR;
	  emp_cursor ref_cursor_type;
	  emp_record emp%ROWTYPE;
	  v_dname dept.dname%TYPE;
	BEGIN
	  OPEN dept_cursor(&dno);
	  LOOP
	     FETCH dept_cursor INTO v_dname,emp_cursor;
	     EXIT WHEN dept_cursor%NOTFOUND;
	     dbms_output.put_line('部门名:'||v_dname);
	     LOOP
	       FETCH emp_cursor INTO emp_record;
	       EXIT WHEN emp_cursor%NOTFOUND;
	       dbms_output.put_line('----雇员名:'||emp_record.ename
	        ||',岗位:'||emp_record.job);
	     END LOOP;
	  END LOOP;
	  CLOSE dept_cursor;
	END;
	/




































分享到:
评论

相关推荐

    SQL 学习笔记 课堂讲义 , 游标,触发器,存储过程

    首先,我们来看"SQL学习笔记"中的"课堂讲义"部分。这部分内容通常会涵盖SQL的基本语法,如数据查询(SELECT语句)、数据插入(INSERT语句)、数据更新(UPDATE语句)和数据删除(DELETE语句)。除此之外,还会深入...

    ORACLE 游标学习笔记

    在处理过程中需要删除或更新行时,需要使用`SELECT...FOR UPDATE`语句来锁定行,然后在`UPDATE`或`DELETE`语句中使用`WHERE CURRENT OF`子句指定当前游标行。 **循环游标** 循环游标简化了处理游标的方式,通过`FOR...

    PL/SQL学习笔记6

    下面将详细解释游标的基本概念、分类以及如何在PL/SQL中使用。 1. **游标**: - 游标本质上是一个指向结果集中的特定位置的指针。通过游标,开发者可以在每次迭代中访问结果集中的一条记录。 - 游标分为两类:...

    mysql中游标的使用案例详解(学习笔记)

    **3.2 案例二:使用游标的存储过程** 现在让我们使用游标来实现相同的功能,但逐行处理结果集中的数据。 ```sql CREATE PROCEDURE p2() BEGIN DECLARE row_cat_id INT; DECLARE row_cat_name VARCHAR(90); ...

    oracle学习笔记(从入门到精通)

    压缩包主要包括15个文档,主要是本人学习oracle过程中的笔记,希望...08-PLSQL和游标结合学习笔记.txt 09-游标学习笔记.txt 10-重要的函数的学习笔记.txt 11-存储过程学习笔记.txt 12-触发器学习笔记.txt 13-pl编码.txt

    配套学习资料:Java开发 - 尚硅谷JDBC学习笔记

    Java开发 - 尚硅谷JDBC学习笔记是一套深入解析Java数据库连接(JDBC)技术的教程,涵盖了从基础到进阶的各种知识点。JDBC是Java编程语言中用于访问数据库的标准应用编程接口,它允许程序员使用Java来执行SQL语句,...

    oracle最全学习笔记(个人总结)

    ### Oracle 最全学习笔记知识点梳理 #### 一、存储过程 - **定义**:存储过程是一种在数据库中存储复杂程序以便外部程序调用的一种数据库对象。 - **应用场景**:主要用于执行大量的更新或插入操作,以提高数据库...

    Oracle 10g 学习笔记

    │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置listener.ora【避免出现ORA-12514错误】.txt │ 贴子树状态存储结构.jpg │ 贴子树状态存储结构.sql │ ├─01...

    PLSQL学习笔记(1-7)

    本学习笔记涵盖了从基础到进阶的PLSQL知识,旨在帮助读者全面理解和掌握这一强大的数据库编程工具。 1. **基础概念** - **PL/SQL块**:PLSQL程序的基本结构是块,包括声明部分、执行部分和异常处理部分。 - **...

    Oracle SQLServer数据库 学习笔记

    6. **性能监控与调优**:使用性能监视工具,分析并优化数据库性能。 7. **高级特性**:如视图、存储过程、触发器、游标等的使用。 8. **实战项目**:通过实际案例,将理论知识应用于解决实际问题。 通过深入学习这...

    oracle pl的学习笔记

    描述中提到的内容包含了游标、存储过程、触发器以及集合等PL/SQL的重要概念,并指出学习笔记中包含练习题,这有助于初学者加深理解并掌握PL/SQL编程。 从提供的部分内容来看,知识点包括以下几个方面: 1. SET ...

    Oracle学习笔记.doc

    ### Oracle学习笔记知识点详解 #### 一、SQL概述与Oracle...以上是关于Oracle学习笔记中的主要知识点详细介绍,涵盖了SQL的基础概念、基本操作、高级查询技巧等多个方面,帮助读者全面掌握Oracle数据库的使用方法。

    oracle plsql 菜鸟学习笔记

    通过本文,我们可以了解 Oracle PL/SQL 的基础知识点,包括变量命名规则、过程和函数的创建、PL/SQL 块结构、变量和常量、游标、异常处理、包的创建和使用、记录类型、输出信息等。这些知识点是 Oracle PL/SQL 编程...

    Sqlserver2008--学习笔记(自己总结)

    ### Sqlserver2008 学习笔记精要 #### 第一章 SQL Server 基础 ##### 1. T-SQL 语句基础 - **创建数据库**: 使用 `CREATE DATABASE` 语句来创建一个新的数据库。例如: ```sql CREATE DATABASE 新数据库名; ``...

    oracle学习笔记

    Oracle学习笔记概述 Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,由甲骨文公司(Oracle Corporation)开发和维护。它以其高效、稳定和强大的功能在企业级应用中占据重要地位。Oracle学习笔记...

    pl/sqle学习笔记

    ### PL/SQL 学习笔记知识点详解 #### 1. PL/SQL 基本结构 - **DECLARE**: 在此部分声明变量、常量、数据类型及游标。 - **BEGIN**: 主程序体开始,可以包含任何合法的PL/SQL语句。 - **EXCEPTION**: 异常处理部分,...

    Oracle经典学习笔记

    "Oracle经典学习笔记"很显然是一份针对Oracle数据库系统的学习资料,特别关注的是其SQL查询语言的使用。Oracle SQL是SQL标准的一个扩展,提供了许多特性和功能,使得数据库管理和数据操作更为高效和灵活。 首先,...

    SQL2005学习笔记

    《SQL2005学习笔记》是一份深入探讨SQL Server 2005核心概念、功能及优化策略的宝贵资料。SQL Server 2005是微软推出的一款强大的关系型数据库管理系统,它在数据存储、处理和分析方面具有广泛的应用。这份笔记旨在...

    ORACLE学习笔记2:日常应用、深入管理、性能优化.

    第13章 游标 第14章 任务调度 第15章 事务与锁定 第3篇 系统优化 第16章 数据库内存和进程的配置与优化 第17章 常用性能监测、分析和优化工具 第18章 对SQL语句进行分析和优化 第19章 索引和提示优化 第20章...

Global site tag (gtag.js) - Google Analytics