我正在开发PL/SQL,它通过使用序列和循环以增量方式将值插入到表中。有830行需要插入值。但是,它仍然显示错误ORA-01422: exact fetch在第11行返回的行数超过请求的行数。导致错误的变量类型是date。并且表的行中的所有日期值都应该与系统日期相同。我应该修复哪个部分才能让它在所有行中插入系统日期?
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;
发布于 2021-10-14 21:21:04
嗯,你写的代码一点意义都没有。
如果要在ORDERS
表中插入行,则应一次插入整行。使用与列数量一样多的INSERT
语句将创建一行,该行中只有一列带有值,其余的将为空。请注意,一旦有一个留空的NOT NULL
列,它就会失败。
除此之外,不带where
子句的select
将返回ORDERS
表中的所有行(因此返回ORA-01422
和too_many_rows
)。
为什么在一些列(customer
、employee
、territory
)和orderingdate
中分别选择序列值?您真的应该在这些列中放入一个序列值吗?将orderingdate
设置为sysdate
意义不大,因为您随后将orderingdate
(我假设这是orders
表中的一个列名)选择到一个同名的变量中。
请注意,您不应该将变量命名为表中的列名。使用前缀,例如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;
发布于 2021-10-14 20:21:46
PL/SQL不允许SELECT语句返回多个行(如果需要的话,必须使用游标)。因为是从ORDERS中选择,所以这些语句中的每一个都将返回与ORDERS表中当前的行数相同的行。相反,请尝试:
SELECT ORDERID_SEQ.NEXTVAL INTO CUSTOMER FROM DUAL;
诸若此类。并删除最后的SELECT (of ORDERINGDATE)。当您已经为其赋值时,您不需要从数据库中选择它。
https://stackoverflow.com/questions/69579846
复制