Oracle
 sql >> Base de données >  >> RDS >> Oracle

Utilisation d'une chaîne dans la procédure stockée Oracle

Pour autant que je comprenne votre problème, vous avez besoin d'une méthode pour accepter une chaîne délimitée par des virgules comme entrée, la diviser en une collection d'entiers, puis comparer un nombre (lire :entier) avec les valeurs de cette collection.

Oracle propose principalement trois types de collections - varrays , tableaux imbriqués et tableaux associatifs . J'expliquerais comment convertir une chaîne délimitée par des virgules en une table imbriquée et l'utiliser pour interroger ou comparer.

Tout d'abord, vous devez définir un type d'objet dans le schéma. Vous pouvez écrire des requêtes en utilisant ce type uniquement si vous le définissez au niveau du schéma.

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

CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id;
/

Ensuite, définissez une fonction comme celle-ci :

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;

Vous avez terminé avec le DDL requis pour cette tâche. Maintenant, vous pouvez simplement écrire votre requête comme :

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