Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como passar varchar com aspas simples para Stored Proc no Oracle


Passe uma coleção e não uma string e use MEMBER OF em vez 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;
/

Então você pode chamá-lo como:
DECLARE
  vCount INTEGER;
BEGIN
  your_package.countPending(
    characterlist( 'A', 'B' ),
    vCount
  );
  DBMS_OUTPUT.PUT_LINE( vCount );
END;
/

Você está passando uma única string e não uma lista de valores - então o IN condição está testando para ver se o PROVIDER column corresponde exatamente a toda a sua string de entrada e não, como você está supondo, a cada elemento de sua lista delimitada entre aspas.
 WHERE 'A' IN ( q'['A', 'B']' )

Nunca corresponderá, pois nem 'A' não é igual a q'['A', 'B']' (ou '''A'', ''B''' ) e a contagem será sempre zero.
 WHERE 'A' IN ( 'A', 'B' )

Corresponderá, mas há dois termos na lista de expressões do IN doença.