mysql %rowtype_Oracle %type和%rowtype小实例

本文介绍了Oracle中的%type和%rowtype关键字,它们可以将变量锚定到数据库列或表的所有列,自动调整变量数据类型。通过示例展示了如何在存储过程和游标中使用这些关键字,强调了%rowtype定义的变量不可当作游标使用的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//%type

//如果声明的变量是直接映射到数据库的某一列上,那么就可以使用%type关键字将变量

//锚定到这个列上。这样做有什么好处呢?

//比如:

//declare v_ename scott.emp.ename%type;

//当数据类型发生变化时,此方法显得非常灵活。

//如果更改了列的长度,那么锚定到该列上的所有变量都会自动更改其长度;

//假设我们将v_ename定义为varchar2(10),那么当emp表中的ename列发生变化时,

//我们得手动将v_enam更改为emp.ename相同的数据长度;

//当我们使用锚定类型后,变量就会自动进行调整。

//%rowtype

//%rowtype与%type相似;不过它将变量锚定到表的所有列,而不是锚定到某一列;

//更多关于%rowtype与%type,

//请参考:http://blog.youkuaiyun.com/BOBO12082119/archive/2010/12/02/6051367.aspx

//下面是一个实例:

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 completed0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值