Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So übergeben Sie varchar mit einfachen Anführungszeichen an Stored Proc in Oracle

Übergeben Sie eine Sammlung, keine Zeichenfolge, und verwenden Sie MEMBER OF statt 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;
/

Dann können Sie es wie folgt aufrufen:

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

Sie übergeben einen einzelnen String und keine Liste von Werten - also IN Bedingung testet, ob der PROVIDER Spalte stimmt genau mit Ihrer gesamten Eingabezeichenfolge überein und nicht, wie Sie annehmen, mit jedem Element Ihrer durch Anführungszeichen getrennten Liste.

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

Wird niemals übereinstimmen, da weder 'A' ist nicht gleich q'['A', 'B']' (oder '''A'', ''B''' ) und die Zählung ist immer Null.

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

Passt, aber es gibt zwei Begriffe in der Ausdrucksliste von IN Zustand.