Recibo el error pls-00405 cuando intento ejecutar este código:

BEGIN
  IF :P10_KAART_CODE IN (SELECT KAART_CODE FROM CADEAUKAART) THEN
     RETURN TRUE;
  ELSE
    RETURN FALSE;
  END IF;
END;

Hay algunas preguntas similares sobre esto, pero no se pudo encontrar una solución para este código simple. ¿Hay otra forma de escribir esto sin enfrentar un error?

4
J. Adam 15 sep. 2018 a las 19:05

4 respuestas

La mejor respuesta

Puede probar un cursor, alternativamente:

DECLARE
  v_flag  boolean := FALSE;  
BEGIN
 FOR c IN ( SELECT KAART_CODE FROM CADEAUKAART )
 LOOP
   IF :P10_KAART_CODE = c.KAART_CODE THEN
     v_flag := TRUE;
     EXIT;
   END IF;
  EXIT WHEN NO_DATA_FOUND;
 END LOOP;
     RETURN v_flag;
END;

Por cierto, el uso de una instrucción select no está permitido, puede enumerar todos los miembros para los valores devueltos de KAART_CODE, como

IF :P10_KAART_CODE IN ('aAA','BBb','ccC'..) THEN

Pero que no es preferible y agradable enumerar todos los valores coincidentes.

0
Barbaros Özhan 15 sep. 2018 a las 17:50

PL / SQL no admite SQL incorporado en las declaraciones if. Por lo tanto, deberá volver a escribir su código de esta manera:

create or replace function validate_kaart_code 
    (P10_KAART_CODE in CADEAUKAART.KAART_CODE%type)
    return boolean
is
    rv boolean;
    l_code CADEAUKAART.KAART_CODE%type;
BEGIN
    begin
        SELECT KAART_CODE into l_code
        FROM CADEAUKAART
        where KAART_CODE =:P10_KAART_CODE 
        and rownum = 1 -- only necessary if KAART_CODE is not unique
        ;
        rv := TRUE;
    exception
        when no_data_found then
            rv := FALSE;
    end;
    RETURN rv;
END;

He intentado reconstruir toda su funcionalidad a partir del fragmento que publicó. Si esto no es lo que pretendía y no puede convertirlo para satisfacer sus necesidades, proporcione más detalles.

2
APC 15 sep. 2018 a las 16:17

Una forma más:

CREATE OR REPLACE FUNCTION IS_KAART_CODE_VALID(pinKAART_CODE IN CADEAUKAART.KAART_CODE%TYPE)
   RETURN BOOLEAN
IS
  nCount  NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO nCount
    FROM CADEAUKAART
    WHERE KAART_CODE = pinKAART_CODE ;

  RETURN CASE
           WHEN nCount > 0 THEN
             TRUE
           ELSE
             FALSE
         END;
END IS_KAART_CODE_VALID;
1
Bob Jarvis - Reinstate Monica 15 sep. 2018 a las 20:53

Movería la condición a la consulta misma, y capturaría una excepción NO_DATA_FOUND:

BEGIN
    SELECT * FROM CADEAUKAART WHERE kaart_code = :P10_KAART_CODE;
    RETURN TRUE;
EXCEPTION  WHEN NO_DATA_FOUND THEN
    RETURN FALSE;
END;
1
Mureinik 15 sep. 2018 a las 16:10