Как в процедуре вставить в таблицу только заданные столбцы?
Из столбца petit.username и из столбца block.regname по условиям вставляются данные в столбцы ACCEPTANCE_LINE, LINE_REVIEW, REGNAME_LINE, USERNAME_LINE в таблицу petit.
Но в таблице petit много столбцов.
Как сделать, чтобы не указывать все эти столбцы? Например, c.f5, c.f6, […], не нужны.
create or replace procedure LINE2 is
a1 integer;
begin
for c in (
select
case when t2.regname like '%sp3%' then '5-555' end ACCEPTANCE_LINE,
case when t.username like '%sp3%' then '5-444' end LINE_REVIEW,
case when t2.regname='53' then '12345' end REGNAME_LINE,
case when t.username='53' then '123456' end USERNAME_LINE ,
t2.regname F5,t.username F6,
[…]
from petit t, block t2 where t.id=t2.id_ger and trunc(t2.date_end) > '01.01.2000'
) loop
select HIBERNATE_SEQUENCE.NEXTVAL into a1 from petit t where rownum=1;
insert into petit values(
c.ACCEPTANCE_LINE, c.LINE_REVIEW,c.REGNAME_LINE, c.USERNAME_LINE,
c.f5, c.f6, […]
);
commit;
end loop;
commit;
end LINE2;
Ответы (2 шт):
Но в таблице petit много полей, как сделать чтобы не прописывать все эти поля ...
Указать, какие нужны:
insert into petit (col1, col2, col3) values (val1, val2, val3);
Никогда не делайте вставку в цикле, всегда вставлятйте массово из запроса. В данном случае, процедура будет выглядеть так:
create or replace procedure LINE2 is
begin
insert into petit (id, acceptance_line, line_review, regname_line, username_line)
select
HIBERNATE_SEQUENCE.NEXTVAL id,
case when t2.regname like '%sp3%' then '5-555' end ACCEPTANCE_LINE,
case when t.username like '%sp3%' then '5-444' end LINE_REVIEW,
case when t2.regname='53' then '12345' end REGNAME_LINE,
case when t.username='53' then '123456' end USERNAME_LINE
from petit t, block t2
where t.id=t2.id_ger and trunc (t2.date_end) > date'2000-01-01';
-- trace (sql%rowcount||' row(s) inserted into petit.'); --по необходимости
end LINE2;
Фиксировть изменения в процедуре не следует. Код, который вызывает процедуру должен решать, что делать с транзакцией - фиксировать ее или откатывать. Как минимум так:
LINE2;
commit;
Можно использовать представление для вставки, которое включает только столбцы обязательные для вставки. Столбцы обьявленные как NOT NULL - всегда обязательны.
Предположим есть такая таблица и надо при вставке обязательнo заполнить col1:
create table tab (
id int generated always as identity,
col1 varchar2 (8) not null,
col2 varchar2 (8) default 'undef',
created date default sysdate,
modified varchar2 (8) default 'itwasme')
/
create or replace view vtab as
select col1 from tab
/
Тогда всё очень просто -- через курсор заполнить необходимые столбцы, а при вставке вообще никаких столбцов указывать не нужно:
declare
type vtabcur is ref cursor return vtab%rowtype;
rc vtabcur;
type vtabrows is table of vtab%rowtype;
newrows vtabrows;
begin
open rc for
select trim (column_value) col1
from xmlTable ('"aaa","bbb","ccc"');
fetch rc bulk collect into newrows;
/**
здесь при необходимости можно изменить/дополнить новые записи согласно бизнес логике
*/
forall rix in 1..newrows.count
insert into vtab values newrows(rix);
end;
/
Результат:
ID COL1 COL2 CREATED MODIFIED
---------- -------- -------- ---------- --------
1 aaa undef 2020-08-22 itwasme
2 bbb undef 2020-08-22 itwasme
3 ccc undef 2020-08-22 itwasme
PS Принятый ТС ответ является решением в его конкретном случае. Данное решение предпочтительно для похожих задач, так как оно более гибкое, и вместе с тем, не менее производительное.