PL / SQL记录填充

时间:2019-03-13 00:44:15

标签: oracle plsql

我有一条记录如下,我想用一个for循环填充它。

declare 
  type ch_type is table of record(id number, name varchar2(50));
  type ch_type_tab is table of ch_type;
  rec_typr ch_type_tab;
begin
  for i in (select * from emp) loop
    rec_typr.id := i.emp_id;
    rec_typr.name := i.first_name;
  end loop;
  for i in rec_typr.first..rec_typr.last
  loop
    dbms_output.put_line(rec_typr(i).id);
  end loop;
end;

但是我得到了错误:

PLS:0302 component first must be declared.

您能帮我吗?

1 个答案:

答案 0 :(得分:1)

代码中有两件事是有问题的。

1)type ch_type is table of record在语法上不正确。您必须首先声明一条记录,然后定义其收集类型。

2)使用隐式游标循环不是加载集合的有效方法,并且绝对不能以您尝试的方式完成。请改用更简单的BULK COLLECT方法。

declare 
  type ch_type is  record(id number, name varchar2(50));
  type ch_type_tab is table of ch_type;
  rec_typr ch_type_tab;
begin
   select emp_id,first_name  bulk collect into 
       rec_typr from emp;

  for i in rec_typr.first..rec_typr.last
  loop
    dbms_output.put_line(rec_typr(i).id);
  end loop;
end;
/

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14


PL/SQL procedure successfully completed.

编辑

  

我需要通过循环而不是通过批量收集来填充记录。   有什么办法吗?

是的,有。但是,它的效率比上述方法低。

declare 
  type ch_type is  record(id number, name varchar2(50));
  type ch_type_tab is table of ch_type;
  rec_typr ch_type_tab := ch_type_tab();
  i INTEGER := 1;
begin
rec_typr.extend;
for rec in 
(
   select emp_id,first_name  bulk collect into 
       rec_typr from emp
       ) 
   loop 
       rec_typr(i).id   := rec.emp_id;
       rec_typr(i).name := rec.first_name;
       rec_typr.extend;
       i := i + 1;
   end loop;

  for i in rec_typr.first..rec_typr.last
  loop
    dbms_output.put_line(rec_typr(i).id);
  end loop;
end;
/