pl / sql - КОЛЛЕКЦИИ И ЗАПИСЬ - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть две таблицы с именами "AA" и "AB"

  • В таблице "AA" у меня есть столбцы, такие как cust_no, name, address и т.д ..
  • В таблице"AB" У меня есть один столбец cuno

Мне нужно извлечь cust_no из таблицы "AA" и поместить его в столбец cuno таблицы "AB".

Я попробовал несколькокод здесь ...

declare
  Type Ty_Handoff_Pc Is Table Of aa%Rowtype Index By Binary_Integer;
  Type sam Is Table Of ab%rowtype;
  l_pc Ty_Handoff_Pc;
  l_ab sam;
begin
  select distinct cust_no bulk collect into l_pc from aa;
  for j in 1 .. 10 loop 
    l_ab(j) := l_pc(j).cust_no;
    insert into ab values l_ab(j);
  end loop;
end;

СПАСИБО ЗА ПРЕДЕЛА

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

jonearles, верно, лучший способ - использовать обычный SQL - вставьте + выберите.

Если у вас есть бизнес-логика, требующая построчную обработку в PL / SQL, вы можетеиспользуйте немного другой вариант того, что у вас было:

declare
  Type Ty_Handoff_Pc Is Table Of aa%Rowtype Index By Binary_Integer;
  Type sam Is Table Of ab%rowtype;
  l_pc Ty_Handoff_Pc;
  l_ab sam;
begin

  select distinct cust_no bulk collect into l_pc from aa;

  for j in 1 .. l_pc.count loop 
    l_ab(j).cuno := l_pc(j).cust_no;
    -- perhaps some other processing here...
  end loop;

  FORALL i in 1..l_ab.count
    insert into ab values l_ab(i);

end;

Преимущество FORALL в конце заключается в том, что вставка выполняется с использованием массива in-bind массива, поэтому вместо этого используется только один вызов механизма SQLпо одному на каждую запись.

2 голосов
/ 30 марта 2011

Вы не можете массово собирать в ассоциативный массив. Вы должны использовать вложенную таблицу, определенную на основе типа столбца, а не типа строки таблицы.

declare
    type Ty_Handoff_Pc is table of aa.cust_no%type;
    Type sam Is Table Of ab%rowtype;
    l_pc Ty_Handoff_Pc;
begin
    select distinct cust_no bulk collect into l_pc from aa;

    for j in 1 .. l_pc.count loop
        insert into ab values(l_pc(j));
    end loop;
end;
/

Редактировать: Как отметил Джеффри Кемп, вы можете массово собирать в ассоциативный массив.

Если это реальный код, и не только для обучения, вам определенно следует делать это в обычном SQL. insert into ab(custno) select distinct cust_no from aa будет намного быстрее, чем при использовании PL / SQL.

0 голосов
/ 14 февраля 2013
declare 
type taba is recor(cust_no aa.cust_no%type);
type tabb is table of taba;
custno_t tabb;
begin 
select cust_no bulk collect into custno_t from aa;
forall i in custno_t.first..custno_t.last
insert into bb values custno_t(i);
commit;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...