PL/SQL中使用%TYPE和%ROWTYPE的区别,%type%rowtype
%TYPE:
定义一个变量,其数据类型与已经定义的某个 数据变量的类型相同,或者与数据库表的某个列的数据类型
相同,这时可以使用%TYPE。
使用%TYPE 特性的优点在于:
1.所引用的数据库列的数据类型可以不必知道;
2. 所引用的数据库列的数据类型可以实时改变。
declare --定义一个记录类型 type emp_record is record( v_name employees.last_name%type, v_email employees.email%type, v_salary employees.salary%type, v_job_id employees.job_id%type); --声明自定义记录类型的变量 v_emp_record emp_record; begin --通过 select ... into ... 语句为变量赋值 select last_name, email, salary, job_id into v_emp_record from employees where employee_id = 101; -- 打印变量的值 dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' || v_emp_record.v_salary || ', ' || v_emp_record.v_job_id); end;返回结果:
Kochhar, NKOCHHAR, 17000, AD_VP PL/SQL procedure successfully completed
%ROWTYPE:
PL/SQL 提供%ROWTYPE 操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
使用%ROWTYPE 特性的优点在于:
1.所引用的数据库中列的个数和数据类型可以不必知道;
2.所引用的数据库中列的个数和数据类型可以实时改变。
declare --声明一个记录类型的变量 v_emp_record employees%rowtype; begin --通过 select ... into ... 语句为变量赋值 select * into v_emp_record from employees where employee_id = 101; -- 打印变量的值 dbms_output.put_line(v_emp_record.last_name || ', ' || v_emp_record.email || ', ' || v_emp_record.salary || ', ' || v_emp_record.job_id || ', ' || v_emp_record.hire_date); end;返回结果:
Kochhar, NKOCHHAR, 17000, AD_VP, 21-9月 -89 PL/SQL procedure successfully completed
记录类型:
记录类型是把 逻辑相关 的数据作为一个单元存储起来 ,称作 PL/SQL RECORD 的域(FIELD) ,其作用是存放互不相同但逻辑相关的信息。
定义记录类型语法如下:
TYPE record_type IS RECORD
(
Field1 type1 [NOT NULL] [:= exp1 ],
Field2 type2 [NOT NULL] [:= exp2 ],
. . . . . .
Fieldn typen [NOT NULL] [:= expn ]
) ;
提示 : 1) DBMS_OUTPUT.PUT_LINE 过程的功能类似于 Java 中的 System.out.println() 直接将输出结果送到标准输出中 .
2) 在使用上述过程之前必须将 SQL * PLUS 的环境参数 SERVEROUTPUT 设置为 ON, 否则将看不到输出结果 :
set serveroutput on
可以用 SELECT 语句对记录变量进行赋值,, 只要保证记录字段与查询结果列表中的字段相配即可。
%type 匹配字段类型
%rowtype 匹配记录类型
在许多情况下,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. 使用%ROWTYPE2.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,lastNameinto v_StudentInfofrom students where studentID=32;2.3 使用%ROWTYPE在PL/SQL中将一个记录声明为具有相同类型的数据库行的作法是很常见的。PL/SQL提供了%ROWTYPE运算符,使得这样的操作更为方便。