Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Как пользоваться %rowtype при вставке в таблицу с identity колонкой?

#sql #oracle #plsql #oracle12c


В БД есть таблицы, у которых много колонок, но выглядят они где-то так:

create table t1 (id number primary key, memo varchar2 (4000));
create sequence seqt1 nocache;  


Вставка в таблицы:

declare
    r t1%rowtype;
begin
    r.id := seqt1.nextval; 
    r.memo := 'first row';
    insert into t1 values r;
end;
/


работает:

        ID MEMO      
---------- ----------
         1 first row 


С переходом на 12c первичный ключ будет выглядеть так:

drop table t1;    
create table t1 (id number generated always as identity primary key, memo varchar2
(4000));


Но предыдущий код вставки с закоментированной строчкой r.id := seqt1.nextval;, даёт
ошибку:


  ORA-32795: cannot insert into a generated always identity column 


Как быть в этом случае?
    


Ответы

Ответ 1



Можно воспользоваться представлением, где идентификатор объявлен как "невидимый" столбец (подробнее о invisible). Как-то так: create table t1 (id number generated always as identity primary key, memo varchar2 (4000)) ; create or replace view viewt1 (id invisible, memo) as select * from t1 ; <> declare r viewt1%rowtype; id number; begin r.memo := 'first row'; insert into viewt1 values r returning id into my.id ; dbms_output.put_line ('inserted '||sql%rowcount||' row(s) id='||id); end; / inserted 1 row(s) id=1

Комментариев нет:

Отправить комментарий