--游标

declare
  cursor 游标名字
  is
  查询语句;
begin
  其他语句;
end;

--游标的属性
%FOUND
%NOTFOUND
%ISOPEN
%ROWCOUNT(当前游标的指针位移量)

--FETCH的两种形式
FETCH cursor_name INTO var1, var2, …;
FETCH cursor_name INTO record_var;

--游标的FETCH循环
LOOP
  FETCH cursor INTO…
  EXIT WHEN cursor%NOTFOUND;
END LOOP

WHILE cursor%FOUND LOOP
  FETCH cursor INTO…
END LOOP

FOR var IN cursor LOOP
  FETCH cursor INTO…
END LOOP

--如果使用了PL/SQL变量在select_statement中, 变量的声明必须放在游标前面
  v_major students.major%TYPE;
DELCARE
  CURSOR c_student IS
  SELECT first_name, last_name
  FROM students
  WHERE major = v_major;

--CURSOR可以带参数
DECLARE
  CURSOR c_student(p_major students.major%TYPE)       --注意返回类型
  SELECT *
  FROM students
  WHERE major = p_major;
  BEGIN
  OPEN c_student( 101 );
  …

--游标举例
declare
  cursor cur_teaname
  is
  select teaname from t_teacher where teatitle='教授';
  teanme t_teacher.teaname%type;
  result varchar2(100);
begin
  open cur_teaname;
  loop
    fetch cur_teaname into teaname;
    exit when cur_teaname%notfound;
    result:=result||teaname||' ';
  end loop;
  dbms_output.put_line(result);
  close cur_teaname;
end;

带参数的游标
IKKI@ test10g> edit
Wrote file ././././afiedt.buf

1  declare
  2    cursor cust_cursor(p_cust_id int,p_last_name varchar2)
  3      is
  4        select cust_id,first_name,last_name,credit_limit
  5        from customer
  6        where cust_id=p_cust_id
  7        and last_name=p_last_name;
  8    customer_record customer%rowtype;
  9  begin
 10    open cust_cursor('&id','&lname');
 11    loop
 12      fetch cust_cursor into customer_record;
 13      exit when cust_cursor%notfound;
 14      dbms_output.put_line(customer_record.cust_id||':'||customer_record.last_name);
 15    end loop;
 16    close cust_cursor;
 17* end;
IKKI@ test10g> /
Enter value for id: 1
Enter value for lname: smith
old  10:   open cust_cursor('&id','&lname');
new  10:   open cust_cursor('1','smith');
1:smith

PL/SQL procedure successfully completed.

使用游标更新数据
IKKI@ test10g> edit
Wrote file ././././afiedt.buf

1  declare
  2    cursor test_cursor is
  3      select ddh,ydrq,jfrq from test for update;
  4    test_record test%rowtype;
  5  begin
  6    open test_cursor;
  7    loop
  8      fetch test_cursor into test_record;
  9      exit when test_cursor%notfound;
 10      dbms_output.put_line('ddh:'||test_record.ddh||',ydrq:'||test_record.ydrq||',jfrq:'||test_record.jfrq);
 11    if test_record.jfrq-test_record.ydrq>15 then
 12      update test set jfrq=ydrq+15 where current of test_cursor;
 13    end if;
 14    end loop;
 15    close test_cursor;
 16* end;
IKKI@ test10g> /
ddh:601,ydrq:01-MAY-90,jfrq:30-MAY-90
ddh:600,ydrq:01-MAY-90,jfrq:29-MAY-90

PL/SQL procedure successfully completed.

IKKI@ test10g> select * from test;

DDH YDRQ         JFRQ
---------- ------------ ------------
       601 01-MAY-90    16-MAY-90
       600 01-MAY-90    16-MAY-90

--用for循环简化的游标

for 记录变量名 in 游标名字 loop
  代码;
end loop;

create or replace function fun_get_teaname(title varchar2)
return varchar2
as
  cursor cur_teaname
  is
  select teaname from t_teacher where teatitle=title;
  result varchar2(100);
begin
  for rec in cur_teaname loop
    result:=result||rec.teaname||' ';
  end loop;
  return(result);
end;

--存储过程和游标配合使用

create or replace procedure  test1(j emp.job%type)
as
  cursor test
  is select empno,ename from emp where job=j;
  eno emp.empno%type;
  ena emp.ename%type;
begin
  open test;
  loop
    fetch test into eno,ena;
    exit when test%notfound;
     dbms_output.put_line(eno||' '||ena);
  end loop;
  close test;
end;

PL/SQL 04 游标 cursor的更多相关文章

  1. PL/SQL使用游标CURSOR

    一.使用游标 对于DML语句和单行select into ,oracle自动分配隐形游标.处理select返回多行语句,可以使用显式游标. 使用显示游标处理多行数据,也可使用SELECT..BULK ...

  2. PL/SQL之--游标

    一.游标简介 在PL/SQL中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),也称为缓冲区.游标是指向该区的一个指 ...

  3. Oracle PL/SQL,游标,过程

    1.PL/SQL  语法相关 -- SQL 语言只是访问,操作数据库的语言,而比并不是程序设计语言,因此不能用于程序开发. -- PL/SQL 是在标准SQl语言上进行过程性扩展后形成的程序设计语言, ...

  4. orcale 之 PL/SQL的游标

    根据我们之前了解到的情况,SQL是面向集合的,我们的查询结果一般包含多条数据,而在PL/SQL 中的变量一般只能存放一条数据,因此变量是无法满足我们的需求的.这时候我们就需要引入游标来为我们解决问题了 ...

  5. PL/SQL之游标的使用

    Oracle中的游标有两种: 显式游标 用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理. 隐式游标 是在执行插入(INSERT).删除(DELETE) ...

  6. PL/SQL编程—游标

    一.游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据,然 ...

  7. 在PL/SQL使用游标获取数据及动态SQL

    1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2.  游标分类: A.  隐式游标 a.  在PL/ ...

  8. Oracle pl/sql 显示游标和隐式游标

    显示游标 一.定义语法:        CURSOR <游标名> IS         <SELECT 语句>         [FOR UPDATE | FOR UPDATE ...

  9. 学习使用MS SQL Server游标(CURSOR)

    说实的,使用MS SQL Server这样久,游标一直没有使用过.以前实现相似的功能,都是使用WHILE循环加临时表来实现.刚才有参考网上示例练习写了一下.了解到游标概念与语法. 下面代码示例中,先是 ...

随机推荐

  1. HDU 4717 The Moving Points(三分法)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description There are N points in total. Every point moves in certain direction and certain speed. W ...

  2. [译]如何比较同一分支上的不同commit的代码区别?

    原文来源:https://stackoverflow.com/questions/3338126/how-do-i-diff-the-same-file-between-two-different-c ...

  3. tcp四次撒手

    转自:http://www.cnblogs.com/cy568searchx/p/3711670.html 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.这个原则是当一方完成它的数据发送任 ...

  4. java正则表达式 3 -- 查找

    用正则表达式执行查找命令,则需要用正则对象,其规则和执行顺序如下: 指定为字符串的正则表达式必须首先被便以为此类的实例.然后,可将得到的正则对象匹配任意的字符串用于创建Mather对象,执行匹配所涉及 ...

  5. P2066 机器分配

    题目背景 无 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M≤15 ...

  6. 【题解】SDOI2009学校食堂

    不知道有没有人跟我有一样的感觉……实际上很多的状压DP都不难,然而调到心碎……这题题面看起来很长,还有混合的‘位运算’来吓唬人(实际上就是异或而已).但实际上只要仔细阅读,发现也是一道水水的裸题. 首 ...

  7. [Leetcode] Populating next right pointer in each node 填充每个节点的右指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  8. CF869E The Untended Antiquity 解题报告

    CF869E The Untended Antiquity 题目描述 \(\text{Adieu l'ami}\). Koyomi is helping Oshino, an acquaintance ...

  9. MySQL:BlackHole

    MySQL:BlackHole 顾名思义BlackHole就是黑洞,只有写入没有输出.现在就来实验一下吧 首先查看一下MySQL支持的存储引擎 mysql> show engines;+---- ...

  10. HDU 5655 四边形判断

    CA Loves Stick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...