Oracle
 sql >> Database >  >> RDS >> Oracle

Come passare varchar con virgolette singole a Stored Proc in Oracle

Passa una raccolta non una stringa e usa MEMBER OF anziché 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;
/

Quindi puoi chiamarlo come:

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

Stai passando una singola stringa e non un elenco di valori, quindi IN la condizione sta verificando se il PROVIDER colonna corrisponde esattamente all'intera stringa di input e non, come si presume, a ciascun elemento dell'elenco delimitato tra virgolette.

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

Non corrisponderà mai poiché né 'A' non è uguale a q'['A', 'B']' (o '''A'', ''B''' ) e il conteggio sarà sempre zero.

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

Corrisponderà ma ci sono due termini nell'elenco delle espressioni di IN condizione.