sql >> Databáze >  >> RDS >> Oracle

Jak předat varchar s jednoduchými uvozovkami do Stored Proc v Oracle

Předejte kolekci, nikoli řetězec, a použijte MEMBER OF spíše než 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;
/

Pak to můžete nazvat jako:

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

Předáváte jeden řetězec a ne seznam hodnot - tedy IN podmínkou je testování, zda PROVIDER sloupec přesně odpovídá celému vašemu vstupnímu řetězci a nikoli, jak předpokládáte, každému prvku vašeho seznamu s uvozovkami.

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

Nikdy se nebude shodovat, protože ani 'A' nerovná se q'['A', 'B']' (nebo '''A'', ''B''' ) a počet bude vždy nula.

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

Bude se shodovat, ale v seznamu výrazů IN jsou dva výrazy podmínka.



  1. ResultTransformer s createSQLQuery nevynucuje žádné camelCase v polích entit

  2. Získejte pouze číslice pomocí regulárního výrazu

  3. Synchronizujte offline databázi SQLite s online databází MySQL

  4. Je design PHP, Python, PostgreSQL vhodný pro obchodní aplikaci?