type与rowtype区别.docx
《type与rowtype区别.docx》由会员分享,可在线阅读,更多相关《type与rowtype区别.docx(9页珍藏版)》请在冰豆网上搜索。
type与rowtype区别
%TYPE:
属性的一种方式是在变量声明中使用。
%TYPE是用于取的表或游标中的字段类型,
例如,可以使用它来声明和ARTIST表中字段类型相同的变量,注意可以在表中名和字段之间使用点号(.)。
DEALARE
V_UNIT_NAME kwmis_xm_unit_bg.UNIT_NAME%TYPE;
V_BGOID kwmis_xm_unit_bg.BGOID%TYPE;
通过这种方式就不需要明确指定SQL数据类型,从而改善了代码的可维护性,因为表中字段类型的改变会自动反映在PL/SQL中;
%ROWTYPE
使用%ROWTYPE属性可以声明一个基于表或游标的行对象,也称为记录对象,例如,可以基于ARTIST声明一个行对象:
declare
想a一旦生成这条记录,那么就可以通过游标使用句号来提取newXmUnitBg的字段值,例如newXmUnitBg.UNIT_NAME 单位名称, newXmUnitBg.BGOID 变更申请号
cursor frdm_cursor is SELECT FRDM_TZH FROM kwmis_xm_unit_bg WHERE bgoid=V_BGOID and bg_flag='1'
AND FRDM_TZH in(select frdm from kwmis_unit_baseinfo);
begin
OPEN frdm_cursor;
LOOP
FETCH frdm_cursor INTO v_frdm;
if frdm_cursor%notfound then frdm_cursor%found
exit when frdm_cursor%notfound frdm_cursor%found
%TYPE是跟表中的字段的类型一致,是变量类型.而%ROWTYPE是跟表中的行类型一致,是record类型.
我是搞Java的,看到DBA的存储过程这样写,不知是什么意思,请Oracle朋友讲解一下.
create or replace procedure sp_update_customer
is
v_c_rowvalue t_customer_info%rowtype;
v_p_rorvalue t_product_info%rowtype;
v_customer_id t_customer_info.customer_id%type;
==========================================================
%rowtype是指什么意思呀,我知道t_customer_info是一个table来的.
%ROWTYPE 提供了一个对应特定表的一整行的复合类型
v_c_rowvalue t_customer_info%rowtype;
表示,v_c_rowvalue 将具有 跟 表t_customer_info 相同的行结构,可以存放以行数据。
使用时 v_c_rowvalue.colname即可。
▲使用%ROWTYPE属性
/*使用%ROWTYPE属性*/
/*用%ROWTYPE属性声明的记录变量自动具有和引用表的列名一致的字段名*/
DECLARE
selPart tb_phone_no%ROWTYPE;
BEGIN
SELECT phone_no,city_code,city_name,state,type
INTO selPart
FROM tb_phone_no
WHERE phone_no='1333241';
DBMS_OUTPUT.PUT_LINE('phone_no:
' || selPart.phone_no ||
' city_code:
' || selPart.city_code ||
' city_name:
' || selPart.city_name ||
' state:
' || selPart.state ||
' type:
' || selPart.type);
END;
------------------------------
SQL> desc tb_phone_no;
名称 是否为空?
类型
------------------------------- -------- ----
PHONE_NO NOT NULL VARCHAR2(7)
CITY_CODE NOT NULL VARCHAR2(4)
CITY_NAME NOT NULL VARCHAR2(8)
STATE NOT NULL VARCHAR2(6)
TYPE NOT NULL VARCHAR2(6)
OraclePL/SQL中如何使用%TYPE和%ROWTYPE
OraclePL/SQL中如何使用%TYPE和%ROWTYPE
1.使用%TYPE
在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据。
在这种情况下,变量应该拥有与表列相同的类型。
例如,students表的first_name列的类型为VARCHAR2(20),我们可以按照下述方式声明一个变量:
DECLARE
v_FirstNameVARCHAR2(20);
但是如果first_name列的定义改变了会发生什么(比如说表改变了,first_name现在的类型变为VARCHAR2(25))?
那就会导致所有使用这个列的PL/SQL代码都必须进行修改。
如果你有很多的PL/SQL代码,这种处理可能是十分耗时和容易出错的。
这时,你可以使用”%TYPE”属性而不是将变量类型硬性编码。
例如:
DECLARE
v_FirstNamestudents.first_name%TYPE;
通过使用%TYPE,v_FirstName变量将同students表的first_name列的类型相同(可以理解为将两者邦定起来)。
每次匿名块或命名块运行该语句块以及编译存储对象(过程、函数、包、对象类和触发器)时,就会确定该类型。
使用%TYPE是非常好的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。
2.使用%ROWTYPE
2.1PL/SQL记录
PL/SQL记录类型类似于C语言中的结构,是一种复合类型,是用户自定义的。
记录提供了一种处理独立的但又作为一个整体单元相关的变量的机制。
请看:
DECLARE
v_StudentIDNUMBER(5);
v_FirstNameVARCHAR2(20);
v_LastNameVARCHAR2(20);
这3个变量在逻辑上是相互关联的,因为他们指向students表中不同的字段。
如果为这些变量声明一个记录类型,那么他们之间的关系就十分明显,可作为一个单元进行处理。
DECLARE
/*Definearecordtypetoholdcommonstudentinformationi*/
TYPEt_StudentRecordISRECORD(
StudentIDNUMBER(5),
FirstNameVARCHAR2(20),
LastNameVARCHAR2(20);
/*Declareavariableofthistype.*/
v_StudentInfot_StudentRecord;
2.2记录赋值
可以用SELECT语句向记录赋值,这将会从数据库中检索数据并将该数据存储到记录中。
注意的是,记录中字段应该和查询结果列表中的字段相匹配。
SELECTstudentID,firstName,lastName
intov_StudentInfo
fromstudentswherestudentID=32;
2.3使用%ROWTYPE
在PL/SQL中将一个记录声明为具有相同类型的数据库行的作法是很常见的。
PL/SQL提供了%ROWTYPE运算符,使得这样的操作更为方便。
例如:
DECLARE
v_RoomRecordrooms%ROWTYPE;
将定义一个记录,该记录中的字段将与rooms表中的列相对应。
createorreplaceprocedureinsert_student
is
inumber:
=0;
begin
whilei<=5000loop
insertintostudentvalues(student_seq.nextval,'bbb','d','1236547');
i:
=i+1;
endloop;
commit;
end;
begin
insert_student;
end;
createorreplaceprocedurehire_date(
empidinnumber
)
is
nameemp.ename%TYPE;
sal emp.sal%TYPE;
begin
selectename,sal
intoname,sal
fromemp
whereempno=empid;
dbms_output.put_line(name);
dbms_output.put_line(sal);
end;
begin
hire_date(7876);
end;
createorreplaceprocedurehire_date1(
empidinnumber
)
is
emp_recordemp%ROWTYPE;
begin
select*
intoemp_record
fromemp
whereempno=empid;
dbms_output.put_line(emp_record.ename);
dbms_output.put_line(emp_record.sal);
dbms_output.put_line(emp_record.empno);
end;
createorreplaceprocedurerowcount(
empidnumber
)
is
delenumnumber;
begin
deleteemp
whereempno=empid;
delenum:
=SQL%ROWCOUNT;
commit;
dbms_output.put_line(delenum);
end;
setserveroutputon;
begin
rowcount(7369);
end;
begin
insertintostudentvalues(student_seq.nextval,'a','m','1223565');
savepointa;
insertintostudentvalues(student_seq.nextval,'a','m','1223565');
savepointb;
insertintostudentvalues(student_seq.nextval,'a','m','1223565');
savepointc;
insertintostudentvalues(student_seq.nextval,'a','m','1223565');
savepointd;
rollbacktosavaepointb;
commit;
end;
begin
insertintostudentvalues(0000,'a','m','1223565');
savepointa;
insertintostudentvalues(1111,'a','m','1223565');
savepointb;
insertintostudentvalues(2222,'a','m','1223565');
savepointc;
insertintostudentvalues(3333,'a','m','1223565');
savepointd;
rollbacktosavaepointb;
commit;
end;
setserveroutputon;
declare
inumber:
=1;
begin
loop
dbms_output.put_line(i);
i:
=i+1;
exitwheni>=20;
endloop;
end;
setserveroutputon;
declare
inumber:
=0;
begin
foriin1..10 loop
dbms_output.put_line(i);
endloop;
end;
setserveroutputon;
begin
foriin1..10 loop
dbms_output.put_line(i);
endloop;
end;
%type和%rowtype有什么不同
比如:
表tb1(col1number,col2varchar2(10))
t_coltb1.col1;//声明为number型的
t_coltb1%rowtype//可以存放一行,包括col1number,col2varchar2(10)
sorry,漏了%type;
t_coltb1.col1%type;//等价于声明t_col为number型的
%type保证内部变量保持与给该变量提供值的数据库字段有
相等的数据类型(有相同的格式类型和长度),其语法要求:
在%type前面有表名及字段名,用一个圆点将表名和字段名
隔开;%rowtype有类似的功能,不同的是:
它在内存中为
相应表的每一个字段都建立一个内部变量,其语法要求:
在%rowtype前加表名。
其区别为:
%type仅仅是一个变量
而%rowtype是一组变量的集合,例如:
假设有一块表emp有两个字段department_name和salary,则
declare
deptemp.department_name%type;--定义一个变量
emp_rowemp%rowtype;--定义一组(2个)变量
begin
...
end;
很简单,如果你关心的只是表的某个字段,那用%type,如果你关心的是表属性,那么用%rowtype,此外在PLSQL中,这是个好习惯