向 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-01422
, too_many_rows
你得到了)。
为什么将序列值分别选择到某些列(customer
、employee
、territory
)和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;
我正在研究 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-01422
, too_many_rows
你得到了)。
为什么将序列值分别选择到某些列(customer
、employee
、territory
)和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;