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

Brug af streng i Oracles lagrede procedure

Så vidt jeg forstår dit problem, har du brug for en metode til at acceptere en kommasepareret streng som input, opdele den i en samling af heltal og derefter sammenligne et tal (læs:heltal) med værdierne i denne samling.

Oracle tilbyder hovedsageligt tre typer samlinger - varrays , indlejrede tabeller og associative arrays . Jeg vil forklare, hvordan man konverterer en kommasepareret streng til en indlejret tabel og bruger den til at forespørge eller sammenligne.

Først skal du definere en objekttype i skemaet. Du kan kun skrive forespørgsler ved hjælp af denne type, hvis du definerer det på skemaniveau.

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

CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id;
/

Dernæst skal du definere en funktion som denne:

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;

Du er færdig med den DDL, der kræves til denne opgave. Nu kan du blot skrive din forespørgsel som:

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


  1. plsql - hvordan man returnerer associative array til java

  2. Installer Oracle-klient i docker-container

  3. Få alle tabellens rækker opdateret efter et bestemt tidspunkt

  4. Hvordan får man en dato i formatet ÅÅÅÅ-MM-DD fra et TSQL-dato-tidsfelt?