向 table 插入值时,精确提取 returns 多于请求的行数错误

Exact fetch returns more than requested number of rows error while inserting value to the table

我正在研究 PL/SQL,它通过使用序列和循环将值插入到 table 中。有 830 行需要插入值。 但是,它一直显示错误 ORA-01422: exact fetch returns more than the requested number of rows at the line 11. 导致错误的变量类型是日期。并且 table 行中的所有日期值应与系统日期相同。我应该修复哪一部分让它在所有行中插入系统日期?

CREATE SEQUENCE ORDERID_SEQ
START WITH 11080
INCREMENT BY 1
NOCACHE;

DECLARE
LOOPCOUNT NUMBER :=1;
CUSTOMER ORDERS.CUSTOMERID%type;
EMPLOYEE ORDERS.EMPLOYEEID%type;
TERRITORY ORDERS.TERRITORYID%type;
ORDERINGDATE ORDERS.ORDERDATE%type;

BEGIN
LOOP
ORDERINGDATE := SYSDATE;
SELECT ORDERID_SEQ.NEXTVAL INTO CUSTOMER FROM ORDERS;
INSERT INTO ORDERS (CUSTOMERID) VALUES (CUSTOMER);
SELECT ORDERID_SEQ.NEXTVAL INTO EMPLOYEE FROM ORDERS;
INSERT INTO ORDERS (CUSTOMERID) VALUES (EMPLOYEE);
SELECT ORDERID_SEQ.NEXTVAL INTO TERRITORY FROM ORDERS;
INSERT INTO ORDERS (CUSTOMERID) VALUES (TERRITORY);
SELECT ORDERINGDATE INTO ORDERINGDATE FROM ORDERS;
INSERT INTO ORDERS (ORDERDATE) VALUES (ORDERINGDATE);
LOOPCOUNT := LOOPCOUNT+1;
EXIT WHEN LOOPCOUNT >= 830;
END LOOP;
END;

PL/SQL 不允许 SELECT 语句 return 超过一行(如果需要,则必须使用游标)。因为您正在 selecting FROM ORDERS,所以这些语句中的每一个都将 return 与当前 ORDERS table 中的行一样多。而是尝试:

SELECT ORDERID_SEQ.NEXTVAL INTO CUSTOMER FROM DUAL;

等等。并删除最后的 SELECT(ORDERINGDATE)。当您已经为它分配了一个值时,您不需要从数据库中 select 它。

嗯,你写的代码一点意义都没有。

如果要将行插入 ORDERS table,则应一次插入整行。使用与列一样多的 INSERT 语句将创建一行,其中只有一列具有值,其余列为空。请注意,一旦 NOT NULL 列留空,它就会失败。

除此之外,没有 where 子句的 select 将 return 来自 ORDERS table 的所有行(因此 ORA-01422too_many_rows 你得到了)。

为什么将序列值分别选择到某些列(customeremployeeterritory)和orderingdate?您真的应该将序列值放入这些列中吗?将 orderingdate 设置为 sysdate 并不意味着你选择 orderingdate (我认为这是 orders table 中的列名)到变量中同名

请注意,您不应将变量命名为与 table 中的列名相同的名称。使用前缀,例如v_orderingdate.

说你必须插入 830 行:为什么是 830?您正在从 ORDERS 中选择并插入 ORDERS。不是说不可能,而是——你到底在做什么?而不是循环,考虑在 SQL(即不是 PL/SQL)级别(我猜列名)的单个 insert 语句:

INSERT INTO orders (customerid,
                    employee,
                    territory,
                    orderingdate)
   SELECT orderid_seq.NEXTVAL,
          employee,
          territory,
          SYSDATE
     FROM some_other_table;