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

Utilizzo della stringa nella procedura memorizzata Oracle

Per quanto ho capito il tuo problema, hai bisogno di un metodo per accettare una stringa delimitata da virgole come input, suddividerla in una raccolta di numeri interi e quindi confrontare un numero (leggi:intero) con i valori in questa raccolta.

Oracle offre principalmente tre tipi di raccolte - varray , tabelle nidificate e array associativi . Spiegherei come convertire una stringa delimitata da virgole in una tabella nidificata e usarla per eseguire query o confrontare.

Innanzitutto, è necessario definire un tipo di oggetto nello schema. Puoi scrivere query utilizzando questo tipo solo se lo definisci a livello di schema.

CREATE OR REPLACE TYPE entity_id AS OBJECT (id_val NUMBER(28));
/

CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id;
/

Quindi, definisci una funzione come questa:

FUNCTION comma_to_nt_integer (p_comma_delimited_str IN VARCHAR)
    RETURN entity_id_set IS
    v_table     entity_id_set;
BEGIN
    WITH temp AS (SELECT TRIM(BOTH ',' FROM p_comma_delimited_str) AS str FROM DUAL)
        SELECT ENTITY_ID(TRIM (REGEXP_SUBSTR (t.str,
                                    '[^,]+',
                                    1,
                                    LEVEL)))
                   str
          BULK COLLECT INTO v_table
          FROM temp t
    CONNECT BY INSTR (str,
                      ',',
                      1,
                      LEVEL - 1) > 0;

    RETURN v_table;
END comma_to_nt_integer;

Hai finito con il DDL richiesto per questa attività. Ora puoi semplicemente scrivere la tua query come:

SELECT *
  FROM ..  
 WHERE ...
       AND gfcid in (table(comma_to_nt_integer(GDFCID_STRING)));