zoukankan      html  css  js  c++  java
  • Oracle学习笔记(十)

    光标(游标)概念引入
    就是一个结果集(查询或者其他操作返回的结果是多个时使用)
    定义一个光标
    cursor c1 is select ename from emp;

    从光标中取值
    打开光标:
    --open c1;(打开光标执行查询)
    关闭光标:
    --close c1;(关闭游标释放资源)
    取一行光标的值:
    --fetch c1 into pename;(取一行到变量中)

    fetch的作用:
    --把当前指针指向的记录返回
    --将指针指向下一条记录

    使用光标查询员工姓名和工资,并打印
    declare
    --定义一个光标
    cursor cemp is select ename,sal from emp;
    --为光标定义对应的变量
    pename emp.ename%type;
    psal emp.sal%type;
    begin
    --打开光标
    open cemp;

    loop
    --取一条记录
    fetch cemp into pename,psal;

    --思考:1、循环什么时候退出? 2、fetch不一定能取到记录
    --exit when 没有取到记录;

    exit when cemp%notfound;

    --打印
    dbms_output.put_line(pename||'的薪水是'||psal);

    end loop;
    --关闭光标
    close cemp;
    end;

    1、光标的属性:
    %found 取到值就是found
    %notfound 取不到是这个

    示例:给员工涨工资(根据职位涨工资)
    总裁涨1000
    经理涨800
    其他员工涨400
    更改表中的job为empjob,

    --涨工资之前的薪水
    select ename,job,sal from emp;

    set serveroutput on
    declare
    --定义光标代表给哪些员工涨工资
    --alter table 'SCOTT' 'EMP' rename column 'JOB' to empjob
    --定义一个光标
    cursor cemp is select empno,empjob from emp;
    --为光标定义对应的变量
    pempno emp.empno%type;
    pjob emp.empjob%type;
    begin
    rollback;
    --打开光标
    open cemp;

    loop
    --取一条记录
    fetch cemp into pempno,pjob;
    exit when cemp%notfound;

    --判断员工的职位
    if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
    elsif pjob='MANAGER' then update emp set sal=sal+800 where empno=pempno;
    else update emp set sal=sal+400 where empno=pempno;
    end if;
    end loop;
    --关闭光标
    close cemp;

    --对于oracle,默认的事务隔离级别是read committee
    --事务的ACID(原子性/一致性/隔离性/持久性)
    commit;
    DBMS_OUTPUT.PUT_LINE('涨工资完成');
    end;

    1、光标的属性;
    %found(取到值为true)
    %notfound(取不到值为true)
    %isopen(判断光标是否打开,因为oracle数据库默认一个会话中打开的光标数是有限制的300个)
    %rowcount(影响的行数,即已经被提取的行数,并非集合中的总行数)。

    事例1:%isopen用法

    set serveroutput on
    declare
    --定义一个光标
    cursor cemp is select empno,empjob from emp;
    --为光标定义对应的变量
    pempno emp.empno%type;
    pjob emp.empjob%type;
    begin
    --打开光标
    open cemp;

    if cemp%isopen then
    DBMS_OUTPUT.PUT_LINE('光标已经打开');
    else
    DBMS_OUTPUT.PUT_LINE('光标没有打开');

    end if;
    --关闭光标
    close cemp;
    end;

    事例2:%rowcount用法

    set serveroutput on
    declare
    --定义一个光标
    cursor cemp is select empno,empjob from emp;
    --为光标定义对应的变量
    pempno emp.empno%type;
    pjob emp.empjob%type;
    begin
    --打开光标
    open cemp;
    loop
    --取出一条记录
    fetch cemp into pempno,pjob;
    exit when cemp%notfound;

    --打印rowcount的值
    DBMS_OUTPUT.PUT_LINE('rowcount'||cemp%rowcount);

    end loop;
    --关闭光标
    close cemp;
    end;


    2、光标的限制,默认情况下,orcle数据库只允许在同一个会话中,打开300个光标
    --切换到管理员
    conn sys/1234 as sysdba
    --查看参数
    show parameter cursor

    修改光标数量的限制
    alter system set open_cursors=400 scope=both;

    scope的取值有三个
    both(后两个同时更改),memory,spfile(数据库需要重启)

    3、带参数的光标
    --查询某个部门中员工的姓名
    set serveroutput on
    declare
    ---定义带参数的光标
    cursor cemp(dno number) is select ename from emp where deptno=dno;
    pename emp.ename%type;

    begin
    --打开光标
    open cemp(10);
    loop
    --取出一条记录
    fetch cemp into pename;
    exit when cemp%notfound;

    DBMS_OUTPUT.PUT_LINE(pename);

    end loop;
    --关闭光标
    close cemp;
    end;

    ***********光标是SQL中代替集合(数组)使用的参数.**********

  • 相关阅读:
    hdu 2553 N皇后问题(dfs)
    hdu 1043 Eight(双向bfs)
    牛人的ACM经验 (转)
    康托和逆康托展开(转)
    hiho Mission Impossible 6(模拟 未提交验证。。)
    数组越界也可以这么巧~~~
    poj 1679 The Unique MST(次小生成树)
    zoj 3204 Connect them(最小生成树)
    hdu 4463 Outlets(最小生成树)
    廖雪峰Java1-2程序基础-8字符和字符串
  • 原文地址:https://www.cnblogs.com/liuyangfirst/p/6418571.html
Copyright © 2011-2022 走看看