`
greemranqq
  • 浏览: 974733 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

PL/SQL 游标的使用(四)

阅读更多

 

介绍:

DML / Select执行时的内存空间

游标(cursor)是指向这个内存空间的指针.

 

属性:

%ROWCOUNT %FOUND %NOTFOUNF %ISOPEN

 

隐式游标 / 显式游标(自定义游标名称)

SQL%ROWCOUNT / mycur%ROWCOUNT

 

显示游标的使用步骤:

1.定义游标

2.打开游标

3.操作游标

4.关闭游标

 

先建立一张表test_table:userid,user_name,password 3个字段

 

 

--显示打印,这里用的是显示游标
SET serveroutput ON;
--1.游标使用
DECLARE
  v_name test_table.user_name%TYPE;
  v_pwd test_table.PASSWORD%TYPE;
  -- 1. 定义游标,把名字和SQL语句绑定
  -- sql : select user_name,PASSWORD from test_table;
  CURSOR test_cursor IS
    SELECT user_name,PASSWORD FROM test_table;
BEGIN
  -- 2. 打开游标:执行对应的SQL.取出记录
  -- 等同于:rs = stmt.excuteQuery(sql);
  OPEN test_cursor;
  -- 3.循环取出游标中的结果,每次操作取一条,并使指针下移一条
  loop
    fetch test_cursor INTO v_name,v_pwd;
    exit WHEN test_cursor%notfound;
    dbms_output.put_line('name :'||v_name||' pwd :'||v_pwd);
  END loop;
    dbms_output.put_line('totle:'||test_cursor%rowcount);
    -- 关闭游标,释放内存
    CLOSE test_cursor;
end;

 

--2.定义有参数的游标
DECLARE
  v_name test_table.user_name%TYPE;
  v_pwd test_table.PASSWORD%TYPE;
  -- 1. 定义游标
  CURSOR test_cursor(v_id NUMBER) IS
    SELECT user_name,PASSWORD FROM test_table where user_id = v_id;
BEGIN
  -- 2. 打开游标,这里可以传入参数
  OPEN test_cursor(2);
  -- 3.操作游标,这里用主键查询,其实只有一条记录,你可以尝试其他的条件查询
  loop
    fetch test_cursor INTO v_name,v_pwd;
    exit WHEN test_cursor%notfound;
    dbms_output.put_line('name :'||v_name||' pwd :'||v_pwd);
  END loop;
    dbms_output.put_line('totle:'||test_cursor%rowcount);
    -- 关闭游标,释放内存
    CLOSE test_cursor;
end;

 

-- 3.游标类型和游标变量的使用
--类型语法:TYPE ref_type_name IS REF CURSOR [RETURN return_type];
--变量语法:cursor_name ref_type_name , 自定义变量名 + 游标类型

DECLARE
  -- 定义一个动态(ref)游标类型,强类型(有RETURN)
  TYPE test_cursor_type
    IS  REF CURSOR RETURN test_table%rowtype;
  -- 定义一个游标变量,并使用刚才的类型
  mycursor test_cursor_type;
  -- 定义一个 行 类型,存放数据
  myrecord test_table%rowtype;
BEGIN
  -- 打开游标时,定义对应的SQL 语句。
  OPEN mycursor FOR SELECT * FROM test_table;
  loop
    fetch mycursor INTO myrecord;
    exit WHEN mycursor%notfound;
    dbms_output.put_line(myrecord.user_id||' '||myrecord.user_name);
  END loop;
  CLOSE mycursor;
end;

 

--3.1 这是弱类型实例

DECLARE
  input CHAR(1) := upper('&input');
  --定义记录类型 和 记录变量
  TYPE record_type IS record(
    v_id NUMBER,
    v_char varchar2(100)
  );
  myrecord record_type;
  
  -- 定义游标类型和游标变量
  TYPE cursor_type IS REF CURSOR; -- 无返回值,弱类型
  mycursor cursor_type;
  
BEGIN
  IF input = 'A' THEN
    OPEN mycursor
      FOR SELECT user_id,user_name FROM test_table;
      
  elsif input = 'B' THEN
    OPEN mycursor
      FOR SELECT user_id,PASSWORD FROM test_table;
    
  END IF;
  
  
  fetch mycursor INTO myrecord;
  while mycursor%found loop
    dbms_output.put_line(myrecord.v_id||' '||myrecord.v_char);
    fetch mycursor INTO myrecord;
  --可以使用下面的循环方式
  --loop


     --fetch mycursor INTO myrecord;
     --dbms_output.put_line(myrecord.v_id||' '||myrecord.v_char);
     --exit WHEN mycursor%notfound;
     
  END loop;
     dbms_output.put_line('total :'||mycursor%rowcount);
  CLOSE mycursor;
end;

 

--4 下面尝试一个简单的隐式游标:
  BEGIN 
  	INSERT INTO test_table VALUES(999,'123','123');
 	 dbms_output.put_line(sql%rowcount);
  end;
  --或者
  DECLARE
  	name varchar2(100);
  BEGIN 
 	 SELECT user_name INTO NAME FROM test_table WHERE user_id = 999;
  	dbms_output.put_line(SQL%rowcount);
  end;

 

--5 这个静态游标的使用,提前编译,速度更快。
DECLARE
  CURSOR mycursor IS
    SELECT * FROM test_table;
BEGIN 
  FOR myrecord  IN mycursor loop
    dbms_output.put_line(myrecord.user_id);
  END loop;
end;

--5.1 和上面的一样,利用for 进行嵌套
BEGIN 
  FOR myrecord  IN(SELECT * FROM test_table) loop
    dbms_output.put_line(myrecord.user_id);
  END loop;
end;

 

提示:

1. 游标相当于指针在数据空间排列的数据之间移动

 

2. 强弱类型只是看你是否要强制指定返回的类型,这里举例可能不好,可以根据参数查询不同的表

 

3. 显示游标都要用open cursor,而隐式不用,比如insert update DELETE select..into 等等

   隐式游标不能用open fetch 等操作,属性%ISOPEN 会一直打开,语句结束就关闭

 

4.静态 动态游标的使用关键看你是否有不同的语句 或者参数。相当于更加灵活。 如果你仅仅一条SQL查询,就用静态游标就行了

 

5.into  可以用 BULK COLLECT INTO代替,前者是一条一条的放,后者的批量存放,但是要求存放必须是集合类型(is table of)可参考:http://blog.csdn.net/robinson_0612/article/details/7545597

0
0
分享到:
评论

相关推荐

    一个对数据库的操作工具PL/SQLpl/sqL工具

    3. **游标**:PL/SQL支持游标,允许用户逐行处理查询结果,这对于处理大量数据时非常有用。 4. **事务管理**:PL/SQL提供BEGIN、COMMIT、ROLLBACK等语句来管理事务,确保数据的一致性和完整性。 5. **异常处理**:...

    pl/sql最新中文手册

    1. **PL/SQL基础**:手册可能会从基础开始,介绍PL/SQL的基本结构,包括声明变量、常量、游标、记录类型等。还会讲解如何编写存储过程、函数和触发器。 2. **控制流程语句**:这包括条件判断(IF-THEN-ELSIF-ELSE)...

    oracle10g_pl/sql

    - **游标变量**:用于存储游标状态,可以在PL/SQL中传递和操作。 - **包**:将相关的过程、函数和变量打包在一起,便于管理和重用。 6. **PL/SQL性能优化** - **绑定变量**:减少解析次数,提高执行效率。 - **...

    PL/SQL中用到的几种不同类型的游标写法(转)

    PL/SQL还支持匿名块游标,也称为块内游标,它是在没有声明游标变量的情况下直接在PL/SQL块中使用的。例如: ```sql BEGIN FOR emp_rec IN (SELECT first_name, last_name FROM employees WHERE department_id = ...

    Oracle PL/SQL实战(待续)

    PL/SQL中的游标是处理单行或多行结果集的重要工具。它们允许我们逐行处理查询结果,非常适合在循环中进行数据操作。声明游标的基本语法是`DECLARE cursor_name CURSOR FOR select_statement;`,然后通过`OPEN`, `...

    oracle pl/sql从入门到精通 配套源代码

    在Oracle PL/SQL中,我们可以通过使用SQL语句来与数据库进行交互,例如SELECT用于查询数据,INSERT、UPDATE和DELETE用于修改数据。PL/SQL还提供了游标(CURSOR)机制,允许我们逐行处理查询结果。此外,PL/SQL还支持...

    Oracle PL/SQL程序设计(第5版)(上下册)

    #### 四、PL/SQL中的SQL - **SQL语句的执行**:介绍如何在PL/SQL代码中嵌入SQL语句,包括查询、插入、更新和删除操作。 - **动态SQL**:探讨如何构造和执行动态SQL语句,这对于需要根据运行时条件生成SQL的情况非常...

    PL/SQL 基本知识

    这篇博客主要探讨了PL/SQL的基础知识,包括其语法特性、使用场景以及在数据库管理中的重要性。 首先,PL/SQL是一种过程化语言,它允许用户定义变量、控制流程(如循环、条件语句)、处理异常,并且可以嵌入SQL查询...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    Oracle PL/SQL是一种强大的编程语言,它将数据库管理和应用程序逻辑紧密结合起来,是Oracle数据库系统中的核心组件之一。这本书“Oracle PL/SQL实例编程”显然旨在深入讲解如何利用PL/SQL进行实际开发工作,通过实例...

    oracle 经典资料及PL/SQL 使用指南 英文版

    这篇“Oracle经典资料及PL/SQL使用指南”的英文版,将帮助学习者深入理解Oracle数据库的基础概念以及PL/SQL的高级用法。 一、Oracle数据库基础 1. 数据库架构:Oracle数据库采用多层架构,包括物理存储层、逻辑...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    3. **游标**:在PL/SQL中如何使用游标处理单行或多行数据,以及游标的声明、打开、关闭和循环遍历。 4. **记录类型**:定义和操作记录类型,用于处理动态或不确定的数据结构。 5. **集合类型**:包括数组(PLS_...

    PL/SQL入门到精通书的源代码

    12. **游标变量**:游标变量是PL/SQL中的一种特殊变量,可以直接存储查询结果,用于在程序中传递查询结果。 13. **PL/SQL与Oracle数据库对象**:学习如何在PL/SQL中创建、修改和删除数据库对象,如表、视图、索引等...

    PL/SQL编程基础知识

    需要注意的是,在PL/SQL中只能使用SQL的DML(Data Manipulation Language)部分,而不能直接使用DDL(Data Definition Language)部分,如创建表(CREATE TABLE)等操作。如果需要在PL/SQL中执行DDL操作,则需要通过...

    PL/SQL下载

    在使用PL/SQL Developer之前,确保你的计算机已经安装了Oracle客户端或者Instant Client,因为该工具需要连接到Oracle数据库来执行PL/SQL代码。 **学习资源** 对于初学者,可以从以下几个方面入手学习PL/SQL: 1. *...

    pl/sql使用软件

    PL/SQL的使用需要对Oracle数据库有深入的理解,它不仅提供了强大的数据库编程能力,还简化了数据库应用程序的开发。对于那些在Oracle环境中工作的开发者和DBA而言,掌握PL/SQL是必不可少的技能。这款名为“plsql”的...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    3. **游标**:讲解如何使用显式和隐式游标进行查询和遍历结果集,以及游标变量的运用。 4. **动态SQL**:探讨如何在PL/SQL中执行SQL语句,包括EXECUTE IMMEDIATE和PREPARE-EXECUTE-CLOSE模式,以及绑定变量的应用。...

    PL/SQL安装包

    6. **游标**:PL/SQL中的游标允许逐行处理查询结果,是处理复杂数据操作的重要工具。 7. **记录类型和变量**:PL/SQL支持自定义记录类型和变量,使得可以创建更贴近业务需求的数据结构。 这个"PL/SQL安装包"可能...

    Pl/Sql程序设计

    1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...

    pl/sql 学习资料

    - DML操作:INSERT、UPDATE、DELETE语句在PL/SQL中的使用。 - SELECT INTO语句:从查询结果中提取数据到PL/SQL变量。 -游标:使用游标处理多行结果集,进行逐行操作。 3. **异常处理**: - 异常类型:理解预...

Global site tag (gtag.js) - Google Analytics