sql >> Databasteknik >  >> RDS >> Oracle

Använder sträng i Oracles lagrade procedur

Såvitt jag förstår ditt problem behöver du en metod för att acceptera en kommaavgränsad sträng som indata, dela upp den i en samling heltal och sedan jämföra ett tal (läs:heltal) med värdena i denna samling.

Oracle erbjuder huvudsakligen tre typer av samlingar - varrays , kapslade tabeller och associativa arrayer . Jag skulle förklara hur man konverterar en kommaavgränsad sträng till en kapslad tabell och använder den för att fråga eller jämföra.

Först måste du definiera en objekttyp i schemat. Du kan bara skriva frågor med den här typen om du definierar den på schemanivå.

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

CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id;
/

Definiera sedan en funktion så här:

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 är klar med den DDL som krävs för denna uppgift. Nu kan du helt enkelt skriva din fråga som:

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


  1. Skriv en fil till SFTP med Oracle PL/SQL

  2. Mysql-frågor - använder join/union etc

  3. OpenShift webapps mysql java-anslutning

  4. Portera en Ruby/Rails/MRI-app till JRuby