Informe de error ORA-01422:精确提取返回超过请求的行数

时间:2018-05-29 04:08:24

标签: sql oracle plsql

我想在表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

2 个答案:

答案 0 :(得分:2)

为什么使用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,请将上述INSERT括起来BEGIN-END并运行它。再一次:你不需要循环。

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

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

答案 1 :(得分:0)

而不是SELECT INTO语句使用CURSOR来对抗ORA-01422错误,如下面的块所示:

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

FOR R IN 
(
      SELECT C.CLIENTE_ID , C.NOMBRE_CIA , B.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);     
)
LOOP

  V_CLIENTE_ID := R.CLIENTE_ID;
  V_NOMBRE_CIA := R.NOMBRE_CIA;
  V_NRO_BOLETA := R.NRO_BOLETA;

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

END;
相关问题