Oracle复杂数据类型

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),一起交流编程经验。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值