PL / SQL Record заполнить - PullRequest
       2

PL / SQL Record заполнить

0 голосов
/ 13 марта 2019

У меня есть следующая запись, и я хочу заполнить ее циклом 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 Ответ

1 голос
/ 13 марта 2019

В вашем коде есть две проблемы.

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.

EDIT

Мне нужно заполнить запись циклом, а не массовым сбором. Так ли это?

Да, есть. Но он менее эффективен , чем метод, описанный выше.

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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...