PL/SQL插入数据报ORA-01422错误 如何批量插入统一系统日期?
错误原因
- ORA-01422报错的核心是
SELECT INTO语句要求查询结果必须仅返回1行,你代码中所有序列取值、日期变量取值的查询都用ORDERS作为数据源,只要表中存在多行数据,就会返回超过1行的结果触发报错,你提到的第11行附近的日期报错对应SELECT ORDERINGDATE INTO ORDERINGDATE FROM ORDERS这行语句。 - 现有插入逻辑也不符合需求:每次循环执行4次单字段插入,会生成大量其余字段为空的无效行,最终生成的行数也会远超你需要的830行。
修复后的完整代码
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 -- 提前赋值系统日期,所有行共用该值 ORDERINGDATE := SYSDATE; LOOP -- 序列取值从Oracle内置单行表DUAL查询,保证仅返回1行 SELECT ORDERID_SEQ.NEXTVAL INTO CUSTOMER FROM DUAL; SELECT ORDERID_SEQ.NEXTVAL INTO EMPLOYEE FROM DUAL; SELECT ORDERID_SEQ.NEXTVAL INTO TERRITORY FROM DUAL; -- 单次插入完整行,日期直接用已赋值的变量,不需要额外查询 INSERT INTO ORDERS (CUSTOMERID, EMPLOYEEID, TERRITORYID, ORDERDATE) VALUES (CUSTOMER, EMPLOYEE, TERRITORY, ORDERINGDATE); LOOPCOUNT := LOOPCOUNT+1; EXIT WHEN LOOPCOUNT > 830; END LOOP; COMMIT; END; /
核心修改点
- 所有序列取值的查询数据源改为
DUAL(Oracle内置的单行系统表),彻底解决返回多行的报错问题 - 移除
SELECT ORDERINGDATE INTO ORDERINGDATE FROM ORDERS这行无效的查询语句,日期已经提前赋值为SYSDATE,直接插入即可,保证所有行的日期字段都等于执行代码时的系统日期 - 调整插入逻辑为每次循环插入1行完整数据,循环830次刚好生成你需要的830行有效数据,末尾补充
COMMIT避免数据未提交
如果你的业务逻辑中CUSTOMERID/EMPLOYEEID/TERRITORYID不需要用序列生成,可以自行替换为对应固定值或其他取值逻辑即可。
内容的提问来源于stack exchange,提问作者Ricky Lee
相关产品推荐
相关产品推荐

