PL/SQL 块错误问题:NO_DATA_FOUND

问题描述 投票:0回答:1

我不断收到 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 的比较。

sql for-loop plsql oracle11g oracle-sqldeveloper
1个回答
0
投票

这取决于您想要做什么,以防万一该

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;
© www.soinside.com 2019 - 2024. All rights reserved.