#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
Комментариев нет:
Отправить комментарий