SQL 错误:ORA-00947:没有足够的值 - 尝试使用默认值

Posted

技术标签:

【中文标题】SQL 错误:ORA-00947:没有足够的值 - 尝试使用默认值【英文标题】:SQL Error: ORA-00947: not enough values - Try to use DEFAULT values 【发布时间】:2020-01-27 09:34:54 【问题描述】:

我正在尝试使用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 / PLSQL 的新手。

【问题讨论】:

插入到 t (c1, c2 ,c3) 值 (1,2,3) 为您的触发器添加了解决方案。我不确定您是否打算仅根据当前行的 rowtotal 的默认/旧值来增加 rowtotal,但由于这是您的触发器中的代码,所以我只是让它工作。 【参考方案1】:

默认是插入所有列,所以

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;

使用AFTER 会给你这个错误:

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

您似乎正在尝试将 1 添加到任何行的 rowtotal 的当前值。每次您不指定行总计时,该值将是 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;
/

【讨论】:

触发器中不需要 SELECT 语句,您可以简单地分配新值::new.rowtotal := :new.rowtotal + 1; 或更好的:new.rowtotal := coalesce(:new.rowtotal,0) + 1;

以上是关于SQL 错误:ORA-00947:没有足够的值 - 尝试使用默认值的主要内容,如果未能解决你的问题,请参考以下文章

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下:

Mybatis 报错:ORA-00947: 没有足够的值

Oracle 选择变量,错误 ORA-00947 没有足够的值

ORA-00947 当 UPDATE 返回 BULK COLLECT INTO 用户创建的 TYPE TABLE 时出现“没有足够的值”

ORA-00947: 将值放入过程中的类型时没有足够的值

向oracle数据库中添加数据时提示ORA-00947: 没有足够的值