Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak przekazać varchar z pojedynczymi cudzysłowami do Stored Proc w Oracle?

Przekaż kolekcję, a nie ciąg znaków i użyj MEMBER OF zamiast 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;
/

Następnie możesz to nazwać:

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

Przekazujesz pojedynczy ciąg, a nie listę wartości - więc IN warunek jest testowany, aby sprawdzić, czy PROVIDER kolumna dokładnie pasuje do całego ciągu wejściowego, a nie, jak zakładasz, do każdego elementu Twojej listy rozdzielanej w cudzysłowie.

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

Nigdy nie będzie pasować, ponieważ ani 'A' nie równa się q'['A', 'B']' (lub '''A'', ''B''' ), a liczba zawsze będzie wynosić zero.

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

Będzie pasować, ale na liście wyrażeń IN znajdują się dwa terminy stan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MODYFIKUJ KOLUMNĘ w oracle — jak sprawdzić, czy kolumna dopuszcza wartość null przed ustawieniem wartości null?

  2. Rails3 nie może zapisać „ñ” w Oracle 11g

  3. Format daty Oracle

  4. Tłumaczenie Microsoft T-SQL na Oracle SQL

  5. Proszę o podanie kodu ceny tylko wtedy, gdy wpisz :=E