%type、%rowtype 、record区别

1. 使用%TYPE

在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据。在这种情况下,变量应该拥有与表列相同的类型。例如,students表的first_name列的类型为VARCHAR2(20),我们可以按照下述方式声明一个变量:

DECLARE

v_FirstName VARCHAR2(20);

但是如果first_name列的定义改变了会发生什么(比如说表改变了,first_name现在的类型变为VARCHAR2(25))?那就会导致所有使用这个列的PL/SQL代码都必须进行修改。如果你有很多的PL/SQL代码,这种处理可能是十分耗时和容易出错的。

这时,你可以使用”%TYPE”属性而不是将变量类型硬性编码。

例如:

DECLARE

v_FirstName students.first_name%TYPE;

通过使用%TYPE,v_FirstName变量将同students表的first_name列的类型相同(可以理解为将两者邦定起来)。

每次匿名块或命名块运行该语句块以及编译存储对象(过程、函数、包、对象类和触发器)时,就会确定该类型。

使用%TYPE是非常好的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。

2. 使用%ROWTYPE

2.1 PL/SQL记录

PL/SQL记录类型类似于C语言中的结构,是一种复合类型,是用户自定义的。

记录提供了一种处理独立的但又作为一个整体单元相关的变量的机制。请看:

DECLARE

v_StudentID NUMBER(5);

v_FirstName VARCHAR2(20);

v_LastName VARCHAR2(20);

这3个变量在逻辑上是相互关联的,因为他们指向students表中不同的字段。如果为这些变量声明一个记录类型,那么他们之间的关系就十分明显,可作为一个单元进行处理。

DECLARE

/*Define a record type to hold common student informationi*/

TYPE t_StudentRecord IS RECORD(

StudentID NUMBER(5),

FirstName VARCHAR2(20),

LastName VARCHAR2(20);

/*Declare a variable of this type.*/

v_StudentInfo t_StudentRecord;

2.2 记录赋值

可以用SELECT语句向记录赋值,这将会从数据库中检索数据并将该数据存储到记录中。注意的是,记录中字段应该和查询结果列表中的字段相匹配。

SELECT studentID,firstName,lastName

into v_StudentInfo

from students where studentID=32;

2.3 使用%ROWTYPE

在PL/SQL中将一个记录声明为具有相同类型的数据库行的作法是很常见的。PL/SQL提供了%ROWTYPE运算符,使得这样的操作更为方便。

例如:

DECLARE

v_RoomRecord rooms%ROWTYPE;

将定义一个记录,该记录中的字段将与rooms表中的列相对应

例 :

Declare 
 v_rowtype v%Rowtype;
 Begin
    Select * Into v_rowtype From v Where Id=2;---Declare 
 v_rowtype v%Rowtype;
 Begin
    Select * Into v_rowtype From v Where Id=2/;----如果去掉where id=2 则要报错(这里因为%rowtype只能存储一行记录!)
    Dbms_Output.put_line(‘:‘||v_rowtype.id);
 End;

Dbms_Output.put_line(‘:‘||v_rowtype.id);
 End;
 %ROWTYPE
使用%ROWTYPE属性可以声明一个基于表或游标的行对象,也称为记录对象 ,如以下的例:

declare
 v_rowtype   v%rowtype;
 cursor v_test_cursor is
  select * from v where id=1;
begin
 open v_test_cursor;
 loop
  fetch v_test_cursor
  into v_rowtype;
  dbms_output.put_line(‘这是:‘ || v_rowtype.id);
  exit when v_test_cursor%notfound;
 end loop ;
 end;

记录变量 
  定义一个记录变量使用TYPE命令和%ROWTYPE,关于%ROWsTYPE的更多信息请参阅相关资料。 
  记录变量用于从游标中提取数据行,当游标选择很多列的时候,那么使用记录比为每列声明一个变量要方便得多。 
  当在表上使用%ROWTYPE并将从游标中取出的值放入记录中时,如果要选择表中所有列,那么在SELECT子句中使用*比将所有列名列出来要得多。

例: 
SET SERVERIUTPUT ON 
DECLARE 
R_emp EMP%ROWTYPE; 
CURSOR c_emp IS SELECT * FROM emp; 
BEGIN 
OPEN c_emp; 
  LOOP 
  FETCH c_emp INTO r_emp; 
  EXIT WHEN c_emp%NOTFOUND; 
  DBMS_OUT.PUT.PUT_LINE(‘Salary of Employee‘||r_emp.ename||‘is‘|| r_emp.salary); 
  END LOOP; 
CLOSE c_emp; 
END;

----%type 与%rowtype and 集合:record区别见以下的例子就可以看出!

记录类型示例
  Create table StudOnLine  --   --   --   -- 学生上机信息表

   StudID   Varchar2(15),
   StudName  varchar2(20));

Insert Into  StudOnLine ( StudID,StudName ) 
 Values(‘99070470‘,‘ 孙悟空 ‘);
 
 Insert Into   StudOnLine  ( StudID,StudName ) 
 Values(‘99070475‘,‘ 猪八戒 ‘);
DECLARE 
TYPE VIPSTUDREC IS RECORD
   (VIPID VARCHAR2(15),
    VIPNAME VARCHAR2(20));
    
STUDREC VIPSTUDREC;
BEGIN
  SELECT *INTO STUDREC FROM StudOnLine WHERE STUDID=‘99070470‘;
DBMS_OUTPUT.PUT_LINE(STUDREC.VIPNAME);
END;

---select *from StudOnLine;

时间: 2024-10-11 17:23:07

%type、%rowtype 、record区别的相关文章

pack record /record 区别

delphi中Record 和Packed Record的区别 . 分类: delphi 2011-06-25 09:33 3669人阅读 评论(2) 收藏 举报 delphiinteger编译器windows Record 和Packed Record 第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐,而第二种带packed关键字的结构体表明编译器编译该结构体时不需要进行字对齐,这种方式对结构体中的字段访问会比第一种方式慢!但是更节约空间.有Packed 的占用内存小,但是速

ABAP中TYPES与DATA、TYPE与LIKE 区别

1.TYPES与DATA区别: TYPES是用来自定义某种类(型)的,需(用DATA语句)实例化以后才可以使用 DATA 是用来声明基本类型数据对象(实例变量)的,对于用DATA直接定义的结构体对象(不参照其它结构类型) 参照自定义类型生成新数据语法格式如下:TYPES | DATA  ...... TYPE type1 .......        ''type1 代表程序内部类型 参照程序中已经声明的数据对象生成新数据语法格式如下:TYPES | DATA ...... LIKE dobj

oracle 中的%type,%rowtype

oracle 中的%type,%rowtype1.使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2(20),我们可以按照下述方式声明一个变量DECLARE        v_FirstName VARCHAR2(20); 但是如果first_name列的定义改变了会发生什么(比如说表改变了,first_name现在的类型变为VARCHAR2(25))?

type() 和 isinstance()区别

a=111 # type() 返回数据类型 In: type(a)  Out: int In: print(type(a)) Out: <class 'int'> # isinstance() 返回bool值 In:       isinstance(a,int)   Out:    True #两者在判断有继承关系的对象时,结果有区别class A: pass class B(A): pass In: isinstance(A(), A)   Out: True In: type(A())

button标签的type=&quot;submit&quot;与type=&quot;button&quot;的区别

自己在做一个ajax的小例子,发现一个诡异的问题,点击页面button,调用ajax发送请求,后台方法可以成功调用,但是前台的ajax回调函数却没有执行,无论success.error.complete都没走,于是我连续快速点击按钮,发现偶尔可以成功调用success回调函数,更诡异的是,页面居然会刷新...... 经过多次对比测试,终于发现问题原因:button的type属性,将type设置为button,问题解决. type="submit",点击按钮会提交表单且刷新页面: typ

type和isinstance区别

type只能对类型做直接的判断,主要用于获取未知变量的类型. 在程序中几乎很少用到type. 而isinstance功能比type更强,可以对子类型做出推理判断. isinstance主要用于判断A是否继承于B. isinstance在程序中作为类型判断:参数判断:数据类型判断场景:程序校验部分.

&lt;button&gt;和&lt;input type=&quot;button&quot;&gt; 的区别

定义和用法 <button> 标签定义一个按钮. 在 button 元素内部,您可以放置内容,比如文本或图像.这是该元素与使用 input 元素创建的按钮之间的不同之处. <button> 控件 与 <input type="button"> 相比,提供了更为强大的功能和更丰富的内容.<button> 与 </button> 标签之间的所有内容都是按钮的内容,其中包括任何可接受的正文内容,比如文本或多媒体内容.例如,我们可以在

【转】解析&lt;button&gt;和&lt;input type=&quot;button&quot;&gt; 的区别

一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二者相比较, <button> 控件提供了更为强大的功能和更丰富的内容.<button> 与 </button> 标签之间的所有内容都是按钮的内容,其中包括任何可接受的正文内容,比如文本或多媒体内容.例如,我们可以在按钮中包括一个图像和相关的文本,用它们在按钮中创建一个吸引人

type与instance区别

class Foo(object): pass class Bar(Foo): pass obj = Bar() # isinstance用于判断,对象是否是指定类或其派生类的实例 print(isinstance(obj,Foo)) #True print(isinstance(obj,Bar))#True #精确的判断对象是否是指定类的实例 print(type(obj) == Bar) #True print(type(obj) == Foo) #False 原文地址:https://ww