Как в процедуре вставить в таблицу только заданные столбцы?

Из столбца 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 шт):

Автор решения: 0xdb

Но в таблице 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;
→ Ссылка
Автор решения: 0xdb

Можно использовать представление для вставки, которое включает только столбцы обязательные для вставки. Столбцы обьявленные как 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 Принятый ТС ответ является решением в его конкретном случае. Данное решение предпочтительно для похожих задач, так как оно более гибкое, и вместе с тем, не менее производительное.

→ Ссылка