type类型:
1 declare
2 v_in_empno emp.empno%type := 7369;
3 v_out_ename emp.ename%type;
4 begin
5 execute immediate 'select ename from emp where empno = '||v_in_empno into v_out_ename;
6 dbms_output.put_line('雇员名字为:'||v_out_ename);
7* end;
SQL> /
雇员名字为:SMITH
PL/SQL 过程已成功完成。
rowtype类型:
1 declare
2 v_emp emp%rowtype;
3 v_in_empno emp.empno%type := 7369;
4 begin
5 execute immediate 'select * from emp where empno = ' ||v_in_empno into v_emp;
6 dbms_output.put_line('雇员名字为:'||v_emp.ename||' 薪水为:'||v_emp.sal);
7* end;
SQL> /
雇员名字为:SMITH 薪水为:8888
PL/SQL 过程已成功完成。
记录类型:
1 declare
2 type emp_record_type is record(
3 v_ename emp.ename%type,
4 v_sal emp.sal%type
5 );
6 emp_record emp_record_type;
7 begin
8 execute immediate 'select ename,sal from emp where empno = 7369' into emp_record;
9 dbms_output.put_line('雇员名字为:'||emp_record.v_ename||' 薪水为:'||emp_record.v_sal);
10 exception
11 when no_data_found then
12 dbms_output.put_line('出现异常');
13* end;
SQL> /
雇员名字为:SMITH 薪水为:8888
PL/SQL 过程已成功完成。
表类型:
1 declare
2 cursor v_cursor is select ename from emp where deptno = 10;
3 type emp_table_type is table of emp.ename%type index by binary_integer;
4 emp_table emp_table_type;
5 begin
6 open v_cursor;
7 fetch v_cursor bulk collect into emp_table;
8 for i in 1..emp_table.count() loop
9 dbms_output.put_line('雇员名字为:'||emp_table(i));
10 end loop;
11 exception
12 when no_data_found then
13 dbms_output.put_line('出现异常!');
14* end;
SQL> /
雇员名字为:CLARK
雇员名字为:KING
雇员名字为:MILLER
PL/SQL 过程已成功完成。
复合类型:
1 declare
2 --定义一个记录类型:emp_record_type
3 type emp_record_type is record
4 (
5 v_empno emp.empno%type,
6 v_ename emp.ename%type,
7 v_sal emp.sal%type
8 );
9 --声明emp_record是emp_record_type类型的
10 emp_record emp_record_type;
11 --定义一个游标
12 cursor emp_cursor is select empno,ename,sal from emp where deptno = 10;
13 --定义一个PL/SQL表类型:emp_table_type
14 type emp_table_type is table of emp_record_type index by binary_integer;
15 --声明emp_table是emp_table_type类型的
16 emp_table emp_table_type;
17 begin
18 open emp_cursor;
19 fetch emp_cursor bulk collect into emp_table;
20 for i in 1..emp_table.count() loop
21 dbms_output.put_line('雇员编号为:'||emp_table(i).empno||' 名字为:'||emp_table(i).ename||' ?
22 end loop;
23 close emp_cursor;
24 exception
25 when no_data_found then
26 dbms_output.put_line('出现异常');
27* end;
SQL> /
fetch emp_cursor bulk collect into emp_table;
*
ERROR 位于第 19 行:
ORA-06550: 第 19 行, 第 36 列:
PLS-00597: INTO 列表中的表达式 'EMP_TABLE' 类型错误
ORA-06550: 第 19 行, 第 1 列:
PL/SQL: SQL Statement ignored
ORA-06550: 第 21 行, 第 51 列:
PLS-00302: 必须说明 'EMPNO' 组件
ORA-06550: 第 21 行, 第 1 列:
PL/SQL: Statement ignored
<pre name="code" class="sql">SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
不知道是我的9i版本过低原因还是oracle本身不支持将record和table类型合起来用,找了N久没找到确切答案,有知道的可以告诉我一下。
欢迎关注行者摩罗微信公众号(xingzhemoluo),一起交流编程经验。