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: 没有足够的值?代码如下:
Oracle 选择变量,错误 ORA-00947 没有足够的值
ORA-00947 当 UPDATE 返回 BULK COLLECT INTO 用户创建的 TYPE TABLE 时出现“没有足够的值”