sql >> Base de Datos >  >> RDS >> Oracle

Cómo pasar varchar con comillas simples a Stored Proc en Oracle

Pase una colección, no una cadena, y use MEMBER OF en lugar de IN :

CREATE OR REPLACE TYPE characterlist IS TABLE OF CHAR(1);
/

CREATE PACKAGE your_package AS
  PROCEDURE countPending(
    pProviderList IN  characterlist
    pCount        OUT INTEGER
  )
  AS
  BEGIN
    SELECT COUNT(*) 
    INTO pCount
    FROM FUND_CHANGE_REQUEST
    WHERE STATUS IN ('PENDING_CHK', 'PEND_2ND_CHK')
    AND PROVIDER  MEMBER OF pProviderList;
  END;
END;
/

Entonces puedes llamarlo como:

DECLARE
  vCount INTEGER;
BEGIN
  your_package.countPending(
    characterlist( 'A', 'B' ),
    vCount
  );
  DBMS_OUTPUT.PUT_LINE( vCount );
END;
/

Está pasando una sola cadena y no una lista de valores, por lo que IN condición está probando para ver si el PROVIDER columna coincide exactamente con toda la cadena de entrada y no, como supone, con cada elemento de la lista delimitada entre comillas.

 WHERE 'A' IN ( q'['A', 'B']' )

Nunca coincidirá ya que tampoco 'A' no es igual a q'['A', 'B']' (o '''A'', ''B''' ) y el conteo siempre será cero.

 WHERE 'A' IN ( 'A', 'B' )

Coincidirá pero hay dos términos en la lista de expresiones de IN condición.