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