2016-12-22 61 views

Odpowiedz

3

Co nie rozumiesz błędu? Masz kolumnę "tożsamości", w której wartość jest generowana jako sekwencja. Nie możesz do niego wstawić. Tak, wymienić wszystkie inne kolumny:

INSERT INTO LEAVES_APPROVAL(col1, col2, col3, . . .) 
    SELECT col1, col2, col3, . . . 
    FROM REQUESTS_TEMP r 
    WHERE r.CIVIL_NUMBER = 33322 AND 
      r.REQUEST_ID = (SELECT MAX(s.REQUEST_ID) FROM REQUESTS_TEMP s); 

W ogóle, to jest dobry pomysł, aby wyświetlić listę wszystkich kolumn w INSERT tak. Zapobiega to nieoczekiwanym błędom, ponieważ kolumny są w niewłaściwej kolejności lub tabele mają różną liczbę kolumn.

0

Jedna z kolumn w tabeli docelowej (leaves_approval) zawiera kolumnę tożsamości, która została zdefiniowana jako Generowana zawsze.
kolumny tożsamości mogą być tworzone w 2 trybach - Generated zawsze, że nie może być przypisany i Generated domyślnie że może być przypisane.


Jeśli chcesz, możesz zmienić tryb kolumny, a następnie wstawić "tak, jak jest".
Należy wziąć pod uwagę, że może to spowodować utworzenie duplikatów w kolumnie tożsamości lub nie powiodło się z powodu ograniczeń.

ALTER TABLE leaves_approval MODIFY **my_identity_column** GENERATED BY DEFAULT AS IDENTITY; 

Albo można wykluczyć kolumny tożsamości z listy INSERT (ale musisz podać pełną listę kolumn, z wyjątkiem kolumny tożsamości), na przykład -

INSERT INTO leaves_approval (c1,c2,c3,c4,...) 
SELECT c1,c2,c3,c4 ... 
FROM requests_temp r 
WHERE r.civil_number = 33322 
     AND r.request_id = (SELECT Max(s.request_id) 
          FROM requests_temp s) 

Database SQL Language Reference - CREATE TABLE

ALWAYS If you specify ALWAYS, then Oracle Database always uses the sequence generator to assign a value to the column. If you attempt to explicitly assign a value to the column using INSERT or UPDATE, then an error will be returned. This is the default.

BY DEFAULT If you specify BY DEFAULT, then Oracle Database uses the sequence generator to assign a value to the column by default, but you can also explicitly assign a specified value to the column. If you specify ON NULL, then Oracle Database uses the sequence generator to assign a value to the column when a subsequent INSERT statement attempts to assign a value that evaluates to NULL.