SQL Ошибка: ORA-00947: недостаточно значений - попробуйте использовать значения DEFAULT - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь построить таблицу с DEFAULT value:

CREATE TABLE OrderMenu
(
orderid NUMBER(4) PRIMARY KEY,
pid NUMBER(4),
quantity NUMBER(3),
rowTotal NUMBER(4) DEFAULT 0);

И я написал этот триггер для вычисления нового rowTotal значения:

CREATE TRIGGER orderMenuTrig AFTER INSERT ON OrderMenu
FOR EACH ROW 
DECLARE TrigOrderID NUMBER;
BEGIN
     TrigOrderID := :new.orderid;
     UPDATE OrderMenu 
                     SET rowtotal = rowtotal+1;
                     WHERE trigorderid = OrderMenu.orderid;
END;
/

Но когда я пытаюсь INSERT в OrderMenu таблицу:

INSERT INTO OrderMenu VALUES(1234, 111, 2);

Я получил эту ошибку:

Error starting at line : 126 in command -
INSERT INTO OrderMenu VALUES(1234, 111, 2)
Error at Command Line : 126 Column : 13
Error report -
SQL Error: ORA-00947: not enough values
00947. 00000 -  "not enough values"
*Cause:    
*Action:

Буду признателен за любую помощь, чтобы решить ее, я новичок с SQL / PL SQL.

1 Ответ

4 голосов
/ 27 января 2020

По умолчанию вставляются все столбцы, поэтому

INSERT INTO OrderMenu VALUES(1234, 111, 2);

действительно:

INSERT INTO OrderMenu (orderid,pid,quantity,rowtotal)
  VALUES(1234, 111, 2);
ORA-00947: not enough values.

Вы должны использовать:

INSERT INTO OrderMenu (orderid,pid,quantity) VALUES(1234, 111, 2);

Ваш триггер имеет ошибки: SET rowtotal = rowtotal+1; <- точка с запятой. </p>

Использование AFTER выдаст вам эту ошибку:

ORA-04091: table <schema>.ORDERMENU is mutating

Похоже, вы пытаетесь добавить 1 к текущему значению итого для любого ряда. Это значение будет 0 + 1 каждый раз, когда вы не укажете сумму строк. Тем не менее, он никогда не обновит вашу строку (используя BEFORE):

CREATE TRIGGER orderMenuTrig BEFORE INSERT ON OrderMenu
FOR EACH ROW 
DECLARE TrigOrderID NUMBER;
BEGIN
     TrigOrderID := :new.orderid;
     -- this SQL will always be empty (not update anything)
     -- since there are NO rows with the orderid to be inserted
     UPDATE OrderMenu 
        SET rowtotal = rowtotal+1
      WHERE trigorderid = OrderMenu.orderid;
END;
/

Вы можете использовать это вместо:

CREATE OR REPLACE TRIGGER orderMenuTrig BEFORE INSERT ON OrderMenu
FOR EACH ROW 
BEGIN
     :new.rowtotal := coalesce(:new.rowtotal,0) + 1;
END;
/
...