首页 > 解决方案 > 通知错误 ORA-01422:精确提取返回的行数超过了请求的行数

问题描述

我想在表中输入变量INFORME_VENTA。下面是我的代码:

VARIABLE B_ANIO VARCHAR2(8);

EXECUTE :B_ANIO := '042018'; 

DECLARE

V_CLIENTE_ID CLIENTES.CLIENTE_ID%TYPE;
V_NOMBRE_CIA CLIENTES.NOMBRE_CIA%TYPE;
V_NRO_BOLETA BOLETAS.NRO_BOLETA%TYPE;

BEGIN

LOOP

SELECT C.CLIENTE_ID , C.NOMBRE_CIA , B.NRO_BOLETA 
INTO V_CLIENTE_ID , V_NOMBRE_CIA , V_NRO_BOLETA 
FROM BOLETAS B JOIN ORDENES O JOIN CLIENTES C 
ON (C.CLIENTE_ID = O.ORDEN_ID)
ON (B.NRO_BOLETA = O.ORDEN_ID);

INSERT INTO INFORME_VENTA 
VALUES(:B_ANIO , V_CLIENTE_ID , V_NOMBRE_CIA , V_NRO_BOLETA);

END LOOP;

END;

我想将变量放在informe_venta表中,但出现以下错误

Informe de error -
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 11
01422. 00000 -  "exact fetch returns more than requested number of rows"
*Cause:    The number specified in exact fetch is less than the rows returned.
*Action:   Rewrite the query or change number of rows requested

标签: sqloracleplsql

解决方案


为什么使用 PL/SQL?一个简单INSERT的能够完成整个工作:

insert into informe_venta
  select :b_anio, c.cliente_id , c.nombre_cia , b.nro_boleta 
  from boletas b join ordenes o 
    on b.nro_boleta = o.orden_id
  join clientes c 
    on c.cliente_id = o.orden_id;

(在 SQL*Plus 中,您将使用 & 号引用 B_ANIO 变量&b_anio)。

如果它必须是PL/SQL,请将上面的内容附INSERTBEGIN-END并运行它。再一次:你不需要循环。

还有一点:我建议您命名要插入的列,例如

insert into informe_venta (anio, cliente_id, nombre_cia, nro_boleta)
  select ...

推荐阅读