zoukankan      html  css  js  c++  java
  • PL/SQL 04 游标 cursor

    --游标

    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;

  • 相关阅读:
    静态联编和动态联编
    常用Oracle分析函数详解
    Web Service , 不详细的介绍
    Eclipse安装JSEclipse和Spket
    IE中页面不居中,火狐谷歌等正常
    ExtJS3 详解与实践 之 第二章
    IPV6正则
    很漂亮、兼容火狐的Js日期选择,自动填充到输入框
    使用googlecodeprettify高亮显示网页代码
    ExtJS3 详解与实践 之 第三章
  • 原文地址:https://www.cnblogs.com/john2017/p/6364499.html
Copyright © 2011-2022 走看看