2015-08-17 1 views
2

я создал следующую таблицу:java.sql.SQLSyntaxErrorException: ORA-00947: не хватает значений при вставке Заявление

BEGIN 
    EXECUTE IMMEDIATE 'CREATE TABLE "MY2XSYEHT" (
    pKy NUMBER(19, 0) PRIMARY KEY AUTOINCREMENT, 
    cTm NUMBER(19, 0), uTm NUMBER(19, 0), oTm NUMBER(19, 0), eTm NUMBER(19, 0), 
    oID VARCHAR2(32), kID VARCHAR2(32), idx NUMBER(3,0), typ NUMBER(3,0), 
    nVl FLOAT(24), sVl VARCHAR2(64), tVl VARCHAR2(4000))'; 
    EXCEPTION WHEN OTHERS THEN 
    IF SQLCODE != -955 THEN RAISE; 
    END IF; 
END; 

Чем создал последовательность и триггер первичного ключа:

CREATE SEQUENCE "MY2XSYEHT_SEQ" START WITH 1001 INCREMENT BY 1 CACHE 10 

CREATE OR REPLACE TRIGGER "MY2XSYEHT_TRIGGER" 
BEFORE INSERT ON "MY2XSYEHT" 
FOR EACH ROW 
DECLARE 
BEGIN 
    IF(:NEW.pKy IS NULL) THEN 
    :NEW.pKy := "MY2XSYEHT_SEQ".nextval 
    END IF; 
END; 

При выполнении после заявления MERGE, я получаю «ORA-00947: недостаточно значений»

MERGE INTO "MY2XSYEHT" destTable 
USING (SELECT ? oID, ? kID, ? idx, ? typ, ? nVl, ? sVl, ? tVl FROM DUAL) srcTable 
ON (destTable.oID=srcTable.oID 
    and destTable.kID=srcTable.kID 
    and destTable.idx=srcTable.idx) 
WHEN MATCHED THEN UPDATE SET destTable.typ=srcTable.typ, 
    destTable.nVl=srcTable.nVl, 
    destTable.sVl=srcTable.sVl, 
    destTable.tVl=srcTable.tVl 
WHEN NOT MATCHED THEN INSERT VALUES (srcTable.oID, srcTable.kID, srcTable.idx, 
    srcTable.typ, srcTable.nVl, srcTable.sVl, srcTable.tVl) 
+1

Что все "?" Это выполняется через JDBC или другой клиент oracle? В следующий раз отформатируйте свой код. Вы вставляете 7 значений, когда в таблице 12 столбцов. – OldProgrammer

+0

его исполнение через jdbc –

ответ

1

Как OldProgrammer указал out, ваш стол имеет 12 столбцов, и ваша вставка только заполняет 7 из них. Вам нужно либо предоставить значения для всех столбцов, либо указать, какие столбцы вы заполняете, что намного лучше, даже если вы заполняете все, так как это делает его более ясным, что происходит, и позволяет избежать возможных проблем с упорядочением столбцов.

Так это выглядит, как вы хотите делать:

WHEN NOT MATCHED THEN INSERT (oID, kID, idx, typ, nVl, sVl, tVl) 
    VALUES (srcTable.oID, srcTable.kID, srcTable.idx, 
    srcTable.typ, srcTable.nVl, srcTable.sVl, srcTable.tVl) 

Ваш триггер будет автоматически подставлен pKy, а остальные четыре колонки будут вставлены в нуль.