es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PL/SQL: Declaración IF o CASE para verificar dos variables en una sola fila y devolver una tercera variable.

Necesito código PL/SQL para escanear una tabla (vinculada a la página 5 en Apex), verificar si existe una fila con dos variables (un ID específico y un número específico entre 1-3) y devolver una tercera variable de esa fila en un elemento de Oracle Apex (esto es una acción dinámica en la página 10) si existe. Puedo hacer esto con una declaración SELECT y funciona correctamente:

select VARIABLE_3 into :P10_ITEM from TABLE where (ID = :P10_ID and NUM = '1');

Pero no puedo usar esa declaración única porque si la fila no existe, arrojará un error sobre datos faltantes. Por lo tanto, necesito esto como un IF o CASE. Pero cuando intento escribirlo como un IF o CASE en su lugar, no devuelve nada.

    if (:P10_ID = :P5_ID and :P5_NUM = '1') then
       select VARIABLE_3 
       into :P10_ITEM 
       from TABLE 
       where (ID = :P10_ID and NUM = '1');
    end if;

Los datos de muestra serían como (todas las columnas son tipo NUMBER):

ID ... NUM ...  VARIABLE_3
-------------------------
10 ...  1  ...  23
10 ...  2  ...  24
11 ...  1  ...  25
11 ...  2  ...  26
11 ...  3  ...  27
12 ...  1  ...  28

Se valida correctamente y no muestra errores, pero tampoco arroja ningún resultado. Si agrego “else :P10_ITEM := ‘0’;” entonces devolverá 0, por lo que el envío/devolución está bien y sé que la acción dinámica se está ejecutando. ¿Algún consejo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puedes utilizar un cursor para verificar si existe la fila y luego obtener el valor en el elemento. Aquí tienes un ejemplo de bloque de código PL/SQL que puedes utilizar:

    declare 
      cursor c1 is 
        select VARIABLE_3 
        from TABLE 
        where ID = :P10_ID and NUM = '1';
      v_variable_3 TABLE.VARIABLE_3%type;
    begin
      open c1;
      fetch c1 into v_variable_3;
      close c1;
    
      if c1%notfound then
        :P10_ITEM := null;
      else
        :P10_ITEM := v_variable_3;
      end if;
    end;
    

    En este bloque de código, se define un cursor con la declaración SELECT que proporcionaste. Luego, se abre el cursor y se obtiene el valor de VARIABLE_3 en una variable llamada v_variable_3.

    La instrucción IF verifica si se recuperó alguna fila, comprobando si el cursor es %notfound. Si el cursor es %notfound, significa que la fila no existe y el elemento se establece como null. De lo contrario, se establece el valor de VARIABLE_3 en el elemento.

    Espero que esto te ayude a obtener el resultado deseado. Avísame si tienes alguna otra pregunta.

Comments are closed.