zoukankan      html  css  js  c++  java
  • oracle触发器select into和cursor用法的区别

    http://moonsoft.bokee.com/4242018.html

    PL/SQL 中的select ..into.. 以及 游标(Cursor)

                                         

    Select  empno, ename  from emp;返回的是多于一条数据, 这个是肯定的.但是我们声明两个变量来依次获得每条数据的话, 我们只能获得一条记录,因为他们不是数组.

    这种不匹配的现象在电子线路中类似于阻抗不匹配.

     

    如果只是检索一条数据,那么我们可以用

    declare

       var_empno number(10);

       var_ename varchar2(32);

    begin

       select empno , ename into var_empno, var_ename

       from emp

       where empno=7369;

       DBMS_output.put_line(var_empno);

       DBMS_output.put_line(var_ename);

    end;

    /

     

    这是很简单地检索一条数据的方法.

     

    但是我们稍微改一下:

    declare

       var_empno number(10);

       var_ename varchar2(32);

    begin

       select empno , ename into var_empno, var_ename

       from emp;

       DBMS_output.put_line(var_empno);

       DBMS_output.put_line(var_ename);

    end;

    /

    这样就会引发异常:-1422

    如果再该一下,检索不到数据就回得到100的异常代码.

     

    当然我们可以处理这些异常

    When

    Condition

    Then

    Do somethings;

     

    但是如果我们要检索多行数据的每一条数据, 那么单单用

    Select * from table; 是不行的.

    这里我们就需要用游标.

    一个很好的比喻是每次取一点冰块的故事.游标cursor 相当于一个指针,这里没有指向内存,而是指向了一个每次能够取得一条记录的select 语句.

     

    一个在form 里写的post_query(显示完所有的item 进行的)触发:

    declare

                CURSOR a IS select dname from dept where deptno=:emp.deptno;

                a_var varchar2(32);

    begin

                open a ;

                fetch a into a_var;

                :emp.department_name:=a_var;

                if a%notfound then

                            :emp.department_name:='error';

                            end if;

                close a;

    end;

     

    声明不用说了,要先打开,执行,关闭.

    游标的属性

    Cursor%notfound

    Cursor%found

     

    具体可以查阅pl/sqlapi , such as : Knowledge Xpert for PLSQL

    这两个属性代表找到/找不到, 是个boolean ,所有我们可以用if来判断.

     

    关于游标里的局部变量:

    a_var varchar2(32);

     

    要知道table所查出的栏位的数据类型, 我们可以让oracle 自己去查到这个类型,

    a%rowtype.写法比较独特.

     

    我们可以理解成select into 是一种隐式cursor

     

    以上只是基本的了解.以后写程序的时候需要进一步理解.

    作者: 理性的浪漫

  • 相关阅读:
    day1-字符串拼接、表达式、break和continue
    ssh免密登录
    1-5 文档的基本 CRUD 与批量操作
    1-4 安装logstash
    1-3 安装cerebro
    1-2 kibana 7.5.1 安装配置
    1-1 elasticsearch7.5 集群搭建 es 7
    生产环境k8s集群搭建
    Gearman任务分布系统部署windows平台_使用Cygwin
    [转载]单元测试之道(使用NUnit)
  • 原文地址:https://www.cnblogs.com/sumsen/p/2554718.html
Copyright © 2011-2022 走看看