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

转: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

猜你喜欢

转载自q137681467.iteye.com/blog/2115443
今日推荐