type与rowtype区别.docx

上传人:b****8 文档编号:9916767 上传时间:2023-05-22 格式:DOCX 页数:9 大小:17.99KB
下载 相关 举报
type与rowtype区别.docx_第1页
第1页 / 共9页
type与rowtype区别.docx_第2页
第2页 / 共9页
type与rowtype区别.docx_第3页
第3页 / 共9页
type与rowtype区别.docx_第4页
第4页 / 共9页
type与rowtype区别.docx_第5页
第5页 / 共9页
type与rowtype区别.docx_第6页
第6页 / 共9页
type与rowtype区别.docx_第7页
第7页 / 共9页
type与rowtype区别.docx_第8页
第8页 / 共9页
type与rowtype区别.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

type与rowtype区别.docx

《type与rowtype区别.docx》由会员分享,可在线阅读,更多相关《type与rowtype区别.docx(9页珍藏版)》请在冰点文库上搜索。

type与rowtype区别.docx

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中,这是个好习惯

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2