我不断收到 NO_DATA_FOUND 错误,我不知道为什么当我使用 FOR 时它没有给我结果,我不知道我做错了什么。
--EJERCICIO N2
DECLARE
v_tramo1_min NUMBER := 1000001;
v_tramo1_max NUMBER := 3000000;
v_tramo2_min NUMBER := 3000001;
v_tramo2_max NUMBER := 6000000;
v_tramo3 NUMBER := 6000000;
--VARRAY VALOR PESOS NORMALES
TYPE tipo_varray_pesos IS VARRAY(3)
OF NUMBER;
--INCIALIZAMOS VARRAY
varray_pesos_extras tipo_varray_pesos;
--DATOS DEL VARRAY
v_peso_extra1 NUMBER := 300;
v_peso_extra2 NUMBER := 550;
v_peso_extra3 NUMBER := 700;
--ID MINIMO Y MAXIMO CLIENTE
v_id_min NUMBER;
v_id_max NUMBER;
----------------------------------
v_nro_cliente NUMBER;
v_run_cliente NUMBER;
v_nombre_cliente VARCHAR2(50);
v_tipo_cliente VARCHAR2(50);
v_monto_solic_creditos NUMBER;
----------------------------------
TYPE tipo_registro_todosuma IS RECORD(
nro_cliente NUMBER,
run_cliente VARCHAR2(15),
nombre_cliente VARCHAR2(50));
v_registro_todosuma tipo_registro_todosuma;
v_codigo_cliente NUMBER;
BEGIN
--SE DEBE TRUNCAR LA TABLA CLIENTE_TODOSUMA EN TIEMPO DE EJECUCION
EXECUTE IMMEDIATE('TRUNCATE TABLE CLIENTE_TODOSUMA');
--EL VALOR DE LOS PESOS NORMALES $1200 Y LOS PESOS EXTRAS($100, $300, $550 Y $700) DEBERAN SER INGRESADOS A UN VARRAY
varray_pesos_extras := tipo_varray_pesos(v_peso_extra1, v_peso_extra2, v_peso_extra3);
--SE DEBEN PROCESAR TODOS LOS CLIENTES DE UNA SOLA VEZ
SELECT
MIN(nro_cliente),
MAX(nro_cliente)
INTO
v_id_min,
v_id_max
FROM CLIENTE;
FOR codigo_cliente IN v_id_min .. v_id_max LOOP
SELECT
c.nro_cliente,
c.numrun,
c.pnombre ||' '|| c.snombre ||' '|| c.appaterno ||' '|| c.apmaterno,
tc.nombre_tipo_cliente,
SUM(cc.monto_solicitado)
INTO
v_nro_cliente,
v_run_cliente,
v_nombre_cliente,
v_tipo_cliente,
v_monto_solic_creditos
FROM CLIENTE c JOIN TIPO_CLIENTE tc ON(c.cod_tipo_cliente = tc.cod_tipo_cliente)
JOIN CREDITO_CLIENTE cc ON(c.nro_cliente = cc.nro_cliente)
WHERE c.nro_cliente = codigo_cliente
GROUP BY
c.nro_cliente,
c.numrun,
c.pnombre ||' '|| c.snombre ||' '|| c.appaterno ||' '|| c.apmaterno,
tc.nombre_tipo_cliente;
--SE DEBE GENERAR LA INFORMACION DEL AÑO ANTERIOR
END LOOP;
--LOS CALCULOS SE DEBEN REALIZAR EN SENTENCIAS PL/SQL
--EL RESULTADO DEL PROCESO DEBE QUEDAR ALMACENADO EN LA TABLA CLIENTE_TODOSUMA
END;
这个错误一直出现在我身上,我想用for从三个不同的表中获取数据,以便获取每个客户端的数据,而不是CLIENTE表的所有id都在CREDITO_CLIENTE中。我在没有块的情况下进行查询,它给了我结果,我认为问题在于 id 的比较。
这取决于您想要做什么,以防万一该
select
语句没有返回任何内容,但是 - 一般来说 - 您应该处理它。一种选择是使用内部 BEGIN-EXCEPTION-END
块,如本例所示。在异常处理部分,我只是跳过它,但你可以做任何你想做的事情。
BEGIN
--SE DEBE TRUNCAR LA TABLA CLIENTE_TODOSUMA EN TIEMPO DE EJECUCION
EXECUTE IMMEDIATE ('TRUNCATE TABLE CLIENTE_TODOSUMA');
--EL VALOR DE LOS PESOS NORMALES $1200 Y LOS PESOS EXTRAS($100, $300, $550 Y $700) DEBERAN SER INGRESADOS A UN VARRAY
varray_pesos_extras := tipo_varray_pesos (v_peso_extra1, v_peso_extra2, v_peso_extra3);
--SE DEBEN PROCESAR TODOS LOS CLIENTES DE UNA SOLA VEZ
SELECT MIN (nro_cliente), MAX (nro_cliente)
INTO v_id_min, v_id_max
FROM CLIENTE;
FOR codigo_cliente IN v_id_min .. v_id_max
LOOP
--> inner block begins here
BEGIN
-- this query raised NO_DATA_FOUND
SELECT c.nro_cliente,
c.numrun,
c.pnombre || ' ' || c.snombre || ' ' || c.appaterno || ' ' || c.apmaterno,
tc.nombre_tipo_cliente,
SUM (cc.monto_solicitado)
INTO v_nro_cliente,
v_run_cliente,
v_nombre_cliente,
v_tipo_cliente,
v_monto_solic_creditos
FROM CLIENTE c
JOIN TIPO_CLIENTE tc ON (c.cod_tipo_cliente = tc.cod_tipo_cliente)
JOIN CREDITO_CLIENTE cc ON (c.nro_cliente = cc.nro_cliente)
WHERE c.nro_cliente = codigo_cliente
GROUP BY c.nro_cliente,
c.numrun,
c.pnombre
|| ' '
|| c.snombre
|| ' '
|| c.appaterno
|| ' '
|| c.apmaterno,
tc.nombre_tipo_cliente;
--SE DEBE GENERAR LA INFORMACION DEL AÑO ANTERIOR
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- don't do anything (or handle it, somehow)
NULL;
END;
--> inner block ends here
END LOOP;
--LOS CALCULOS SE DEBEN REALIZAR EN SENTENCIAS PL/SQL
--EL RESULTADO DEL PROCESO DEBE QUEDAR ALMACENADO EN LA TABLA CLIENTE_TODOSUMA
END;