Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment passer varchar avec des guillemets simples à Stored Proc dans Oracle

Passez une collection et non une chaîne et utilisez MEMBER OF plutôt que 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;
/

Ensuite, vous pouvez l'appeler comme :

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

Vous transmettez une seule chaîne et non une liste de valeurs - donc le IN la condition teste pour voir si le PROVIDER correspond exactement à l'intégralité de votre chaîne d'entrée et non, comme vous le supposez, à chaque élément de votre liste délimitée entre guillemets.

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

Ne correspondra jamais puisque ni 'A' n'est pas égal à q'['A', 'B']' (ou '''A'', ''B''' ) et le compte sera toujours égal à zéro.

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

Correspondra mais il y a deux termes dans la liste d'expressions du IN état.