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

Použití řetězce v uložené proceduře Oracle

Pokud rozumím vašemu problému, potřebujete metodu, která přijme řetězec oddělený čárkami jako vstup, rozdělí jej na kolekci celých čísel a poté porovná číslo (čti:celé číslo) s hodnotami v této kolekci.

Oracle nabízí především tři typy kolekcívarrays , vnořené tabulky a asociativní pole . Vysvětlil bych, jak převést řetězec oddělený čárkami na vnořenou tabulku a použít ji k dotazování nebo porovnávání.

Nejprve musíte ve schématu definovat typ objektu. Pomocí tohoto typu můžete psát dotazy, pouze pokud jej definujete na úrovni schématu.

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

CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id;
/

Dále definujte funkci, jako je tato:

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;

Jste hotovi s DDL požadovaným pro tento úkol. Nyní můžete jednoduše napsat svůj dotaz jako:

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


  1. Kdy použít MongoDB

  2. Rails 5 SQL Injection

  3. Postgres:udělení přístupu roli/uživateli pro budoucí tabulky vytvořené jinou rolí/uživatelem

  4. Otázky/návrhy na vzor třídy PHP databáze