精华内容
下载资源
问答
  • ORACLE 游标

    2019-08-22 11:18:03
    ORACLE游标概念定义作用类型游标属性使用步骤声明游标打开游标提取数据关闭游标 概念 定义 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。 作用 临时存储从数据库中提取的数据库。 应用场景: 把数据...

    概念

    定义

    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。

    作用

    临时存储从数据库中提取的数据库。

    应用场景:
    把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库,数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。

    类型

    • 显式游标:如果提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理
      返回结果为多行多列的SELECT语句

    • 隐式游标:一次只从数据库中提取一行数据的查询和DML操作,系统都会使用一个隐式游标

    1. 插入操作:INSERT
    2. 更新操作:UPDATE
    3. 删除操作:DELETE
    4. 单行查询操作:SELETE … INTO …

    游标属性

    隐式游标的属性返回值类型意义
    SQL%ROWCOUNT整型代表DML语句成功执行的数据行数
    SQL%FOUND布尔型值为TRUE代表插入、删除、更新或单行查询操作成功
    SQL%NOTFOUND布尔型与SQL%FOUND属性返回值相反
    SQL%ISOPEN布尔型布尔型 DML执行过程中为真,结束后为假
    -- 通过SQL%FOUND属性判断修改是否成功 --
    SET SERVEROUTPUT ON    
            BEGIN  
            UPDATE emp SET sal=sal+100 WHERE empno=1234;   
             IF SQL%FOUND THEN    
            DBMS_OUTPUT.PUT_LINE('成功修改雇员工资!');   
            COMMIT;    
            ELSE  
            DBMS_OUTPUT.PUT_LINE('修改雇员工资失败!');   
             END IF;    
            END;  
    

    使用步骤

    声明游标

    在DECLEAR部分按以下格式声明游标:
    CURSOR 游标名[(参数1 数据类型[,参数2 数据类型…])] : 参数可选
    SELECT语句是对表或视图的查询语句,甚至也可以是联合查询。可以带WHERE条件、ORDER BY或GROUP BY等子句,但不能使用INTO子句。在SELECT语句中可以使用在定义游标之前定义的变量。

    打开游标

    OPEN 游标名[(实际参数1[,实际参数2…])]

    提取数据

    在可执行部分,按以下格式将游标工作区中的数据取到变量中。提取操作必须在打开游标之后进行。
    FETCH 游标名 INTO 变量名1[,变量名2…];

    FETCH 游标名 INTO 记录变量;
    游标打开后有一个指针指向数据区,FETCH语句一次返回指针所指的一行数据,要返回多行需重复执行,可以使用循环语句来实现。控制循环可以通过判断游标的属性来进行。

    关闭游标

    CLOSE 游标名;

    展开全文
  • oracle 游标

    2017-10-14 11:39:00
    这个文档几乎包含了oracle游标使用的方方面面,全部通过了测试 -- 声明游标;CURSOR cursor_name IS select_statement --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个...

    转载:Oracle 游标使用全解

    以下是内容留存。


    这个文档几乎包含了oracle游标使用的方方面面,全部通过了测试

    -- 声明游标;CURSOR cursor_name IS select_statement
    
    --For 循环游标
    --(1)定义游标
    --(2)定义游标变量
    --(3)使用for循环来使用这个游标
    declare
           --类型定义
           cursor c_job
           is
           select empno,ename,job,sal
           from emp
           where job='MANAGER';
           --定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
           c_row c_job%rowtype;
    begin
           for c_row in c_job loop
             dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
           end loop;
    end;
    
    
          
    --Fetch游标
    --使用的时候必须要明确的打开和关闭
    
    declare 
           --类型定义
           cursor c_job
           is
           select empno,ename,job,sal
           from emp
           where job='MANAGER';
           --定义一个游标变量
           c_row c_job%rowtype;
    begin
           open c_job;
             loop
               --提取一行数据到c_row
               fetch c_job into c_row;
               --判读是否提取到值,没取到值就退出
               --取到值c_job%notfound 是false 
               --取不到值c_job%notfound 是true
               exit when c_job%notfound;
                dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
             end loop;
           --关闭游标
          close c_job;
    end;
    
    --1:任意执行一个update操作,用隐式游标sql的属性%found,%notfound,%rowcount,%isopen观察update语句的执行情况。
           begin
             update emp set ENAME='ALEARK' WHERE EMPNO=7469;
             if sql%isopen then
               dbms_output.put_line('Openging');
               else
                 dbms_output.put_line('closing');
                 end if;
              if sql%found then
                dbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行
                else
                  dbms_output.put_line('Sorry');
                  end if;
                  if sql%notfound then
                    dbms_output.put_line('Also Sorry');
                    else
                      dbms_output.put_line('Haha');
                      end if;
                       dbms_output.put_line(sql%rowcount);
                       exception 
                         when no_data_found then
                           dbms_output.put_line('Sorry No data');
                           when too_many_rows then
                             dbms_output.put_line('Too Many rows');
                             end;
    declare
           empNumber emp.EMPNO%TYPE;
           empName emp.ENAME%TYPE;
           begin
             if sql%isopen then
               dbms_output.put_line('Cursor is opinging');
               else
                 dbms_output.put_line('Cursor is Close');
                 end if;
                 if sql%notfound then
                   dbms_output.put_line('No Value');
                   else
                     dbms_output.put_line(empNumber);
                     end if;
                     dbms_output.put_line(sql%rowcount);
                     dbms_output.put_line('-------------');
                     
                     select EMPNO,ENAME into  empNumber,empName from emp where EMPNO=7499;
                     dbms_output.put_line(sql%rowcount);
                     
                    if sql%isopen then
                    dbms_output.put_line('Cursor is opinging');
                    else
                    dbms_output.put_line('Cursor is Closing');
                    end if;
                     if sql%notfound then
                     dbms_output.put_line('No Value');
                     else
                     dbms_output.put_line(empNumber);
                     end if;
                     exception 
                       when no_data_found then
                         dbms_output.put_line('No Value');
                         when too_many_rows then
                           dbms_output.put_line('too many rows');
                           end;
                       
                     
           
    --2,使用游标和loop循环来显示所有部门的名称
    --游标声明
    declare 
           cursor csr_dept
           is
           --select语句
           select DNAME
           from Depth;
           --指定行指针,这句话应该是指定和csr_dept行类型相同的变量
           row_dept csr_dept%rowtype;
    begin
           --for循环
           for row_dept in csr_dept loop
               dbms_output.put_line('部门名称:'||row_dept.DNAME);
           end loop;
    end;
    
    
    --3,使用游标和while循环来显示所有部门的的地理位置(用%found属性)
    declare
           --游标声明
           cursor csr_TestWhile
           is
           --select语句
           select  LOC
           from Depth;
           --指定行指针
           row_loc csr_TestWhile%rowtype;
    begin
      --打开游标
           open csr_TestWhile;
           --给第一行喂数据
           fetch csr_TestWhile into row_loc;
           --测试是否有数据,并执行循环
             while csr_TestWhile%found loop
               dbms_output.put_line('部门地点:'||row_loc.LOC);
               --给下一行喂数据
               fetch csr_TestWhile into row_loc;
             end loop;
           close csr_TestWhile;
    end; 
    select * from emp
    
    
    
           
    --4,接收用户输入的部门编号,用for循环和游标,打印出此部门的所有雇员的所有信息(使用循环游标)
    --CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;
    --定义参数的语法如下:Parameter_name [IN] data_type[{:=|DEFAULT} value]  
    
    declare 
          CURSOR 
          c_dept(p_deptNo number)
          is
          select * from emp where emp.depno=p_deptNo;
          r_emp emp%rowtype;
    begin
            for r_emp in c_dept(20) loop
                dbms_output.put_line('员工号:'||r_emp.EMPNO||'员工名:'||r_emp.ENAME||'工资:'||r_emp.SAL);
            end loop;
    end;
    select * from emp   
    --5:向游标传递一个工种,显示此工种的所有雇员的所有信息(使用参数游标)
    declare 
           cursor
           c_job(p_job nvarchar2)
           is 
           select * from emp where JOB=p_job;
           r_job emp%rowtype;
    begin 
           for r_job in c_job('CLERK') loop
               dbms_output.put_line('员工号'||r_job.EMPNO||' '||'员工姓名'||r_job.ENAME);
            end loop;
    end;
    SELECT * FROM EMP
    
    --6:用更新游标来为雇员加佣金:(用if实现,创建一个与emp表一摸一样的emp1表,对emp1表进行修改操作),并将更新前后的数据输出出来 
    --http://zheng12tian.iteye.com/blog/815770 
            create table emp1 as select * from emp;
            
    declare
            cursor
            csr_Update
            is
            select * from  emp1 for update OF SAL;
            empInfo csr_Update%rowtype;
            saleInfo  emp1.SAL%TYPE;
    begin
        FOR empInfo IN csr_Update LOOP
          IF empInfo.SAL<1500 THEN
            saleInfo:=empInfo.SAL*1.2;
           elsif empInfo.SAL<2000 THEN
            saleInfo:=empInfo.SAL*1.5;
            elsif empInfo.SAL<3000 THEN
            saleInfo:=empInfo.SAL*2;
          END IF;
          UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_Update;
         END LOOP;
    END;
    
    --7:编写一个PL/SQL程序块,对名字以‘A’或‘S’开始的所有雇员按他们的基本薪水(sal)的10%给他们加薪(对emp1表进行修改操作)
    declare 
         cursor
          csr_AddSal
         is
          select * from emp1 where ENAME LIKE 'A%' OR ENAME LIKE 'S%' for update OF SAL;
          r_AddSal csr_AddSal%rowtype;
          saleInfo  emp1.SAL%TYPE;
    begin
          for r_AddSal in csr_AddSal loop
              dbms_output.put_line(r_AddSal.ENAME||'原来的工资:'||r_AddSal.SAL);
              saleInfo:=r_AddSal.SAL*1.1;
              UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_AddSal;
          end loop;
    end;
    --8:编写一个PL/SQL程序块,对所有的salesman增加佣金(comm)500
    declare
          cursor
              csr_AddComm(p_job nvarchar2)
          is
              select * from emp1 where   JOB=p_job FOR UPDATE OF COMM;
          r_AddComm  emp1%rowtype;
          commInfo emp1.comm%type;
    begin
        for r_AddComm in csr_AddComm('SALESMAN') LOOP
            commInfo:=r_AddComm.COMM+500;
             UPDATE EMP1 SET COMM=commInfo where CURRENT OF csr_AddComm;
        END LOOP;
    END;
    
    --9:编写一个PL/SQL程序块,以提升2个资格最老的职员为MANAGER(工作时间越长,资格越老)
    --(提示:可以定义一个变量作为计数器控制游标只提取两条数据;也可以在声明游标的时候把雇员中资格最老的两个人查出来放到游标中。)
    declare
        cursor crs_testComput
        is
        select * from emp1 order by HIREDATE asc;
        --计数器
        top_two number:=2;
        r_testComput crs_testComput%rowtype;
    begin
        open crs_testComput;
           FETCH crs_testComput INTO r_testComput;
              while top_two>0 loop
                 dbms_output.put_line('员工姓名:'||r_testComput.ENAME||' 工作时间:'||r_testComput.HIREDATE);
                 --计速器减一
                 top_two:=top_two-1;
                 FETCH crs_testComput INTO r_testComput;
               end loop;
         close crs_testComput;
    end;
        
    
    --10:编写一个PL/SQL程序块,对所有雇员按他们的基本薪水(sal)的20%为他们加薪,
    --如果增加的薪水大于300就取消加薪(对emp1表进行修改操作,并将更新前后的数据输出出来) 
    declare
        cursor
            crs_UpadateSal
        is
            select * from emp1 for update of SAL;
            r_UpdateSal crs_UpadateSal%rowtype;
            salAdd emp1.sal%type;
            salInfo emp1.sal%type;
    begin
            for r_UpdateSal in crs_UpadateSal loop
               salAdd:= r_UpdateSal.SAL*0.2;
               if salAdd>300 then
                 salInfo:=r_UpdateSal.SAL;
                  dbms_output.put_line(r_UpdateSal.ENAME||':  加薪失败。'||'薪水维持在:'||r_UpdateSal.SAL);
                 else 
                  salInfo:=r_UpdateSal.SAL+salAdd;
                  dbms_output.put_line(r_UpdateSal.ENAME||':  加薪成功.'||'薪水变为:'||salInfo);
               end if;
               update emp1 set SAL=salInfo where current of crs_UpadateSal;
            end loop;
    end;
         
    --11:将每位员工工作了多少年零多少月零多少天输出出来   
    --近似
      --CEIL(n)函数:取大于等于数值n的最小整数
      --FLOOR(n)函数:取小于等于数值n的最大整数
      --truc的用法 http://publish.it168.com/2005/1028/20051028034101.shtml
    declare
      cursor
       crs_WorkDay
       is
       select ENAME,HIREDATE, trunc(months_between(sysdate, hiredate) / 12) AS SPANDYEARS,
           trunc(mod(months_between(sysdate, hiredate), 12)) AS months,
           trunc(mod(mod(sysdate - hiredate, 365), 12)) as days
       from emp1;
      r_WorkDay crs_WorkDay%rowtype;
    begin
        for   r_WorkDay in crs_WorkDay loop
        dbms_output.put_line(r_WorkDay.ENAME||'已经工作了'||r_WorkDay.SPANDYEARS||'年,零'||r_WorkDay.months||'月,零'||r_WorkDay.days||'');
        end loop;
    end;
      
    --12:输入部门编号,按照下列加薪比例执行(用CASE实现,创建一个emp1表,修改emp1表的数据),并将更新前后的数据输出出来
    --  deptno  raise(%)
    --  10      5%
    --  20      10%
    --  30      15%
    --  40      20%
    --  加薪比例以现有的sal为标准
    --CASE expr WHEN comparison_expr THEN return_expr
    --[, WHEN comparison_expr THEN return_expr]... [ELSE else_expr] END
    declare
         cursor
             crs_caseTest
              is
              select * from emp1 for update of SAL;
              r_caseTest crs_caseTest%rowtype;
              salInfo emp1.sal%type;
         begin
             for r_caseTest in crs_caseTest loop
             case 
               when r_caseTest.DEPNO=10
               THEN salInfo:=r_caseTest.SAL*1.05;
               when r_caseTest.DEPNO=20
               THEN salInfo:=r_caseTest.SAL*1.1;
               when r_caseTest.DEPNO=30
               THEN salInfo:=r_caseTest.SAL*1.15;
                when r_caseTest.DEPNO=40
               THEN salInfo:=r_caseTest.SAL*1.2;
             end case;
              update emp1 set SAL=salInfo where current of crs_caseTest;
            end loop;
    end;
    
    --13:对每位员工的薪水进行判断,如果该员工薪水高于其所在部门的平均薪水,则将其薪水减50元,输出更新前后的薪水,员工姓名,所在部门编号。
    --AVG([distinct|all] expr) over (analytic_clause)
    ---作用:
    --按照analytic_clause中的规则求分组平均值。
      --分析函数语法:
      --FUNCTION_NAME(<argument>,<argument>...)
      --OVER
      --(<Partition-Clause><Order-by-Clause><Windowing Clause>)
         --PARTITION子句
         --按照表达式分区(就是分组),如果省略了分区子句,则全部的结果集被看作是一个单一的组
         select * from emp1
    DECLARE
         CURSOR 
         crs_testAvg
         IS
         select EMPNO,ENAME,JOB,SAL,DEPNO,AVG(SAL) OVER (PARTITION BY DEPNO ) AS DEP_AVG
         FROM EMP1 for update of SAL;
         r_testAvg crs_testAvg%rowtype;
         salInfo emp1.sal%type;
         begin
         for r_testAvg in crs_testAvg loop
         if r_testAvg.SAL>r_testAvg.DEP_AVG then
         salInfo:=r_testAvg.SAL-50;
         end if;
         update emp1 set SAL=salInfo where current of crs_testAvg;
         end loop;
    end;

     

    转载于:https://www.cnblogs.com/senyier/p/7666236.html

    展开全文
  • Oracle游标

    2020-01-02 20:58:17
    Oracle游标 游标:逐行处理查询结果,已编程的方式访问数据,类似于jdbc中的的ResultSet 游标类型:隐式游标,显式游标,REF(引用)游标 ref游标定义时不确定数据结构,而是再打开时给出查询语句, 隐式游标的属性有:...

    Oracle游标

    游标:逐行处理查询结果,已编程的方式访问数据,类似于jdbc中的的ResultSet

    游标类型:隐式游标,显式游标,REF(引用)游标

    ref游标定义时不确定数据结构,而是再打开时给出查询语句,

    隐式游标的属性有:

    %ISOPEN –游标是否打开
    对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。
    %FOUND-SQL–语句影响了一行或多行在执行DML语句前值都是null,不影响任何行则返回FALSE否则返回TRUE,NOTFOUND则相反。
    %NOTFOUND-SQL–语句没有影响任何行时为true在执行DML语句前值都是null
    %ROWCOUNT-SQL–语句影响的行数

    %FOUND
    BEGIN 
         UPDATE TEXT SET NAME = '老李' where id = 4;
         if SQL%FOUND  THEN  --更改成功影响1行,则为true ,否则为false
            DBMS_OUTPUT.put_line('修改成功!');
         else
            DBMS_OUTPUT.put_line('没有id为4这个选项');
         end if;
    end;
    
    %ROWCOUNT
    begin 
    DBMS_OUTPUT.put_line('插入前:'||SQL%ROWCOUNT);--输出 “插入前:”
    INSERT INTO TEXT VALUES (4,'隔壁老王',37,'搞破鞋',80000);
    DBMS_OUTPUT.put_line('插入后:'||SQL%ROWCOUNT);--输出 “插入后:1END;
    

    显式游标:

    declare
    cursor 游标名 select * from 表名;--声明游标
    查询变量名 表名%rowtype; -- 查询变量名,类似于jdbc的结果集
    begin
    open 游标名;--打开游标
         loop
            fetch 游标名 into 查询变量名; --提取游标
            exit when 游标名%notfound;--退出循环游标
            --处理语句
            dbms_output.put_line(查询变量名.列名||查询变量名.列名||查询变量名.列名);
         end loop;
    close 游标名;--关闭游标
    end;
    
    带参数的游标

    带参数的游标只是在上面的前提下,在游标名的后面加了个参数。

    declare
    --声明游标,列名1必须相同,类似jdbc中的问号“?”
    cursor 游标名(列名1 列名类型) is select * from 表名 where 列名 =列名1;
    查询变量名 表名%rowtype;
    begin
    open 游标名(where条件);--打开游标,where条件相当于给“?”赋值,也就是列名1
         loop
            fetch 游标名into 查询变量名; --提取游标
            exit when 游标名%notfound;--判断游标是否取完,无则退出循环游标
           --处理语句
            dbms_output.put_line(查询变量名.列名||查询变量名.列名||查询变量名.列名);
         end loop;
    close 游标名;--关闭游标
    end;
    
    for循环带参数的游标

    只是改变了“方法体”。

    declare
    cursor 游标名(列名1 列名类型) is select * from 表名 where 列名 =列名1;
    查询变量名 表名%rowtype;--可以省略,自动声明
    begin
    --for循环帮你打开和关闭游标,并自动提取
         for 查询变量名 in 游标名(where条件);
         loop
            --处理语句
            dbms_output.put_line(查询变量名.列名||查询变量名.列名||查询变量名.列名);
         end loop;
    end;
    例子:
    --for循环带参数的游标
    declare
    cursor text_v(v_ID number) is select * from text where id =v_ID;--声明游标
    textRow text%rowtype;--可以省略,自动声明
    begin
    --for循环帮你打开和关闭游标,并自动提取
         for textRow in text_v(2)
         loop
            dbms_output.put_line('id'||textRow.ID||'姓名'||textRow.NAME||'年龄'||textRow.AGE||'工作'||textRow.JOB||'工资'||textRow.SALARY);
         end loop;
    end;
    
    使用显式游标更新行
    declare
    cursor 游标名 is select * from 表名 for update ;
    begin
           FOR 查询变量名IN 游标名-- 用循环游标读取游标内容
           loop
               IF 查询变量名.列名 =条件(相当于where语句)  then
               update 表名 set 列名 = '更改值' where current of 游标名;
               end if;
           end loop;
    end;
    

    引用游标:

    1:引用游标用于根据业务需求确定查询语句。
    2:只定义游标类型或返回结果的结构。
    3:不定义查询语句。
    4:分类:弱类型,强类型。
    使用:
    1:定义引用游标类型。
    2:使用定义的游标类型声明一个变量。
    3:打开游标时关联一个查询语句。

    声明弱类型的ref游标
    declare
     	 type 游标类型名 is ref cursoe;--定义类型
     	 游标变量名 游标类型名;--使用类型定义游标变量
    begin
    	OPNE 游标变量名 FRO 查询语句; 	 
    
    声明强类型的ref游标
    declare
    --定义类型,指定游标查询语句返回的结构,即表结构
     	 type 游标类型名 is ref cursoe return 表名%rowtype;--定义类型
     	 游标变量名 游标类型名;--使用类型定义游标变量
    begin
    	OPNE 游标变量名 FRO 查询语句; 	 
    
    展开全文
  • Oracle 游标

    2019-02-13 11:02:00
    游标:数据库在执行select、insert、update和delete语句时,oracle会在内存中开辟一个缓存区,用于存放执行结果。游标可以看成是一个指向该区域的指针,可以通过游标对执行结果进行处理(每次只处理一行数据)。 ...

    游标:数据库在执行select、insert、update和delete语句时,oracle会在内存中开辟一个缓存区,用于存放执行结果。游标可以看成是一个指向该区域的指针,可以通过游标对执行结果进行处理(每次只处理一行数据)。

    游标可以分为隐式游标、显式游标和动态游标。

     1、隐式游标

    在执行一个SQL语句时,oracle会自动创建一个隐式游标。隐式游标主要是处理数据操纵语句(update、delete)的执行结果。

    隐式游标的属性

    属性说明
    %found当数据被修改删除时,返回true

    %isopen

    判断游标是否打开,false表示已经打开了
    %notfound执行DML操作时,没有返回数据行,返回true,否则返回false
    %rowcount返回执行DML操作的行数

    例如:更新员工的工资

    begin
      update emp set sal=sal*(1+0.2) where job='MANAGER';
      if sql%notfound then
        dbms_output.put_line('nofound');
      else 
        dbms_output.put_line(sql%rowcount);
      end if;
    end;
    

    2、显式游标

    显式游标是由用户自定义的一种游标,通常操作查询结果集(select语句返回的结果集)。使用步骤:声明游标、打开游标、读取游标和关闭游标。

    显式游标和隐式游标一样,也拥有那四个属性,不过有点不同。

    属性说明
    %found光标打开后,未执行fetch语句时值为NULL。执行fetch语句后,取到了数据值为true,否则为false。

    %isopen

    游标打开为true,关闭为alse。
    %notfound未执行fetch语句时值为NULL。执行fetch语句后,没有取到数据值为true,否则为false。
    %rowcount返回取到的数据行数

     例如:读取职位为 'MANAGER' 的员工信息

    declare
      cursor cur_emp(var_job in varchar2:='MANAGER')
      is select empno,ename,sal from emp
      where job=var_job;
      type record_emp is record(
           var_empno emp.empno%type,
           var_ename emp.ename%type,
           var_sal emp.sal%type);
      emp_row record_emp;
    begin
      open cur_emp('MANAGER');
      fetch cur_emp into emp_row;
      while cur_emp%found loop
        dbms_output.put_line(emp_row.var_empno||','||emp_row.var_ename||','||emp_row.var_sal);
        fetch cur_emp into emp_row;
      end loop;
      close cur_emp;
    end;
    

     3、游标变量

    游标变量可以在运行时和不同的语句关联,可以一次对应多个查询。使用游标变量前,必须先声明,然后再运行时必须为其分配存储空间。

    声明的语法格式:

    type 游标变量类型名称 is ref cursor [return 数据类型]

    例如:使用游标变量读取部门信息

    declare
      type ref_dept is ref cursor
      return dept%rowtype;
      cur_dept ref_dept;
      deptrow dept%rowtype;
    begin
      open cur_dept for select * from dept;
      loop
        fetch cur_dept into deptrow;
        exit when cur_dept%notfound;
        dbms_output.put_line(deptrow.deptno||','||deptrow.dname);
      end loop;
      close cur_dept;
    end; 
    

    4、通过for语句遍历游标

     在使用隐式游标或显式游标处理多行数据的结果集时,用户可以使用for语句遍历。在使用for语句遍历游标中的数据时,可以把它的循环计数器看作是一个自动的record类型的变量。

    例如:隐式游标使用for语句

    
    begin
      for emp_record in(select empno,ename from emp where job='MANAGER')
        loop
          dbms_output.put_line('编号:'||emp_record.empno);
          dbms_output.put_line('姓名:'||emp_record.ename);
        end loop;
    end;

     例如:显式游标中使用for语句

    declare 
        cursor cur_emp is
        select * from emp where deptno=20;
    begin
      for emp_record in cur_emp
        loop
          dbms_output.put_line('编号:'||emp_record.empno);
          dbms_output.put_line('姓名:'||emp_record.ename);
        end loop;
    end;

     

    展开全文
  • Oracle游标全解

    2017-07-20 10:37:36
    Oracle 游标使用全解 ...这个文档几乎包含了oracle游标使用的方方面面,全部通过了测试 -- 声明游标;CURSOR cursor_name IS select_statement --For 循环游标 --(1)定义游标 --(2)定义游标变量
  • oracle游标

    2013-02-20 21:30:26
    很好的oracle游标的使用方法例子 该篇文章为转载 原文地址为[b]http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html[/b] [code="java"] -- 声明游标;CURSOR cursor_name IS select_...
  • oracle游标学习

    2017-03-09 19:12:19
    这个文档几乎包含了Oracle游标使用的方方面面,全部通过了测试 -- 声明游标;CURSOR cursor_name IS select_statement --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 ...
  • 修改后的oracle游标总结,比较的全面 修改后的oracle游标总结,比较的全面 修改后的oracle游标总结,比较的全面
  • oracle游标全解2

    2016-07-05 17:09:09
    oracle游标全解2
  • oracle游标嵌套游标 JavaScript | 游标属性 (JavaScript | Cursor Property) The cursor property in JavaScript is used to change the style of the cursor pointer displayed on the screen. In this article, we...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,667
精华内容 12,266
关键字:

oracle游标的修改