oracle触发器select into和cursor用法的区别
1个回答
展开全部
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/sql的api , such as : Knowledge Xpert for PLSQL
这两个属性代表找到/找不到, 是个boolean 值,所有我们可以用if来判断.
关于游标里的局部变量:
a_var varchar2(32);
要知道table所查出的栏位的数据类型, 我们可以让oracle 自己去查到这个类型,用
a%rowtype.写法比较独特.
我们可以理解成select into 是一种隐式cursor
以上只是基本的了解.以后写程序的时候需要进一步理解.
这种不匹配的现象在电子线路中类似于阻抗不匹配.
如果只是检索一条数据,那么我们可以用
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/sql的api , such as : Knowledge Xpert for PLSQL
这两个属性代表找到/找不到, 是个boolean 值,所有我们可以用if来判断.
关于游标里的局部变量:
a_var varchar2(32);
要知道table所查出的栏位的数据类型, 我们可以让oracle 自己去查到这个类型,用
a%rowtype.写法比较独特.
我们可以理解成select into 是一种隐式cursor
以上只是基本的了解.以后写程序的时候需要进一步理解.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询