2011年03月22日 星期二 13:48 记录类型用于处理单行多列的数据。当使用PL/SQL记录时,应用开发人员既可以自定义记录类 型和记录变量,也可以使用%ROWTYPE属性直接定义记录变量。 1.自定义PL/SQL记录 当使用自定义的pl/sql记录时,需要分别定义记录类型和记录变量。语法如下: TYPE type_name IS RECORD ( field_declaration1,field_declaration2,...); identifier type_name type_name用于指定自定义记录类型的名称,field_declaration用于指定记录成员的定义; identifier用于指定记录变量名。当为记录类型指定多个成员时,记录成员之间用逗号隔开。 示例: declare --自定义一个类型 type my_record_type is record( xm emp.ename%type, --姓名 gzuo emp.job%type, --工作 gzi emp.sal%type --工资 ); --使用自定义类型来定义变量 myValue my_record_type; begin select ename,job,sal into myValue from emp where empno=7844;
dbms_output.put_line('ename='||myValue.xm); dbms_output.put_line('job='||myValue.gzuo); dbms_output.put_line('sal='||myValue.gzi); end; 说明: ?¤在查询时必须与自定义类型的属性顺序一一对应。 ?¤myValue中的属性名也是自定义的,不是字段名。
2.使用%ROWTYPE属性定义记录变量 %ROWTYPE属性可以基于表或视图定义记录变量,当使用该属性定义记录变量时,记录成员的名 称和类型与表或视图列的名称和类型完全相同。 为了简化表或视图所有列数据的处理, 应该使用 该属性定义记录变量,而如果只是处理某几列数据,那么应该使用自定义记录类型和记录变量, 这样可以节省内存空间。语法如下: identifier table_name%ROWTYPE;或者identifier view_name%ROWTYPE; 当使用%ROWTYPE属性定义记录变量时, 记录成员个数, 名称, 类型与表或视图列的个数, 名称, 类型完全相同。示例: dept_record dept%ROWTYPE; emp_record emp%ROWTYPE; 总结: 问题:上面的代码比直接用type类型还多些,看不出优势在什么地方。为什么还要用record? 回答:在项目中,自定义类型通常会放到在包(package,后面会专门学习)中,这样就可以在 其它地方直接引用了。 示例:先在包中自定义类型: create or replace package my_bao as type my_record_type is record( xm emp.ename%type, --姓名 gzuo emp.job%type, --工作 gzi emp.sal%type --工资 ); end; 然后就可以在块中直接使用该类型,只不过在类型前要加上包名:“my_bao”。 declare --使用包中自定义类型来定义变量 myValue my_bao.my_record_type;
begin select ename,job,sal into myValue from emp where empno=7844; dbms_output.put_line('ename='||myValue.xm); dbms_output.put_line('job='||myValue.gzuo); dbms_output.put_line('sal='||myValue.gzi); end; +++++++++++++ 1、type类型。 语法:表.字段%TYPE 返回:某个表的字段的实际类型。 作用:PL/SQL脚本中,有时定义的变量就是存取表中数据的。此时数据类型及长度就需要与字 段的定义一致。可以去查看该字段的具体类型,但这样做很麻烦;并且当字段定义改变时,脚本 也需要修改。所以使用type类型来引用该字段的类型,更方便,维护性更好。 示例:根据工号查询员工姓名。 分析:要从emp表中获取姓名,必须要用查询语句。而要从查询语句中获取返回的值,要加上 “into变量”。 declare v_empno emp.empno%type; v_ename emp.ename%type; begin v_empno:=7900; select ename into v_ename from emp where empno=7900; dbms_output.put_line(v_ename); end;
2、rowtype类型 语法: 表%rowtype 作用: 保存了某一行记录的所有字段的值