视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle%type和%rowtype小实例
2020-11-09 12:06:49 责编:小采
文档


//%type //如果声明的变量是直接映射到数据库的某一列上,那么就可以使用%type关键字将变量 //锚定到这个列上。这样做有什么

Oracle %type和%rowtype小实例

[日期:2011-04-28] 来源:Linux社区 作者:Linux [字体:]

//%type
//如果声明的变量是直接映射到数据库的某一列上,那么就可以使用%type关键字将变量
//锚定到这个列上。这样做有什么好处呢?
//比如:
//declare v_ename scott.emp.ename%type;
//当数据类型发生变化时,此方法显得非常灵活。
//如果更改了列的长度,那么锚定到该列上的所有变量都会自动更改其长度;
//假设我们将v_ename定义为varchar2(10),那么当emp表中的ename列发生变化时,
//我们得手动将v_enam更改为emp.ename相同的数据长度;
//当我们使用锚定类型后,,变量就会自动进行调整。
//%rowtype
//%rowtype与%type相似;不过它将变量锚定到表的所有列,而不是锚定到某一列;
//更多关于%rowtype与%type,
//请参考:
//下面是一个实例:
create table dept(
deptno varchar2(5),
dname varchar2(20),
loc varchar2(20)
);
create or replace procedure pro_insert(
deptno_in in dept.deptno%type,
dname_in in dept.dname%type,
loc_in in dept.loc%type
)
as
v_dept dept%rowtype;
begin
begin
insert into dept
select deptno_in,dname_in,loc_in
from dual;
commit;
dbms_output.put_line('inserting successed');
exception
when others then
rollback;
end;
begin
select deptno_in,dname_in,loc_in
into v_dept from dual;
dbms_output.put_line(
'The data having been inserted.'||
'deptno:'||v_dept.deptno||
',dname:'||v_dept.dname||
',loc:'||v_dept.loc
);
end;
end pro_insert;
//
//上面的过程中,使用到了嵌套块;
//所谓嵌套块就是块中包含其他子块;
//嵌套块允许出现在代码块的异常处理部分和执行部分,
//但是不允许出现在声明中。
//
SQL> set serveroutput on;
SQL> exec pro_insert('111','财务部','福州');
inserting successed
The data having been inserted.deptno:111,dname:财务部,loc:福州
PL/SQL procedure successfully completed
//
//从这里看出来,%rowtype定义的变量作用有点相似游标,
//但是我们不能将%rowtype定义的变量当做游标来使用,
//否则我们将会得到下面的错误:
//ORA-01422: exact fetch returns more than requested number of rows
declare v_dept dept%rowtype;
begin
select deptno,dname,loc
into v_dept
from dept;
dbms_output.put_line(
'The data having been inserted.'||
'deptno:'||v_dept.deptno||
',dname:'||v_dept.dname||
',loc:'||v_dept.loc
);
end;
//
//下面我们用游标来实现上面的操作,具体看下面的匿名块:
declare
cursor cv_dept is
select *
from dept;
begin
//变量v_dept不必我们显示声明
//for循环会为我们隐式的打开和关闭游标,不必我们现实的打开和关闭游标
for v_dept in cv_dept loop
dbms_output.put_line(
'deptno:'||v_dept.deptno||
',dname:'||v_dept.dname||
',loc:'||v_dept.loc
);
end loop;
end;
//
deptno:111,dname:财务部,loc:福州
deptno:120,dname:销售部,loc:大连
deptno:130,dname:科研部,loc:北京
PL/SQL procedure successfully completed

下载本文
显示全文
专题