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

seznam pro svázání proměnné v SQL Developer

Problém je v tom, že dbms_utility.comma_to_table postup vyžaduje, aby prvky seznamu byly platnými identifikátory Oracle, i když to ve skutečnosti není v dokumentech jasně uvedeno. Tento článek AskTom odkazuje na něj prostřednictvím základního name_tokenize postup :

Nesouvisí to s vazbou nebo SQL Developerem, je to omezení databáze.

Stejný druh chyby můžete vidět, pokud zavoláte dbms_utility.comma_to_table postup přímo:

declare
  arr dbms_utility.uncl_array;
  len binary_integer;
begin
  dbms_utility.comma_to_table('USER', len, arr);
end;
/

Error report -
ORA-20001: comma-separated list invalid near R
ORA-06512: at "SYS.DBMS_UTILITY", line 236
ORA-06512: at "SYS.DBMS_UTILITY", line 256
ORA-06512: at line 5

Nebo voláním dbms_utility.name_tokenize přímo:

declare
  a varchar2(30);
  b varchar2(30);
  c varchar2(30);
  d varchar2(30);
  e binary_integer;
begin
  dbms_utility.name_tokenize('USER', a, b, c, d, e);
end;
/

Error report -
ORA-00931: missing identifier
ORA-06512: at "SYS.DBMS_UTILITY", line 167
ORA-06512: at line 8
00931. 00000 -  "missing identifier"

Toto nemůžete použít, pokud jsou vaše hodnoty oddělené čárkami rezervovaná slova nebo nejsou povoleny jako identifikátory z nějakého jiného důvodu; začínající například číslem. Pokud by seznam obsahoval TABLE, měli byste stejný problém nebo 42TAB . To ve skutečnosti není to, k čemu je určen, jak Tom zmiňuje.

Omezení můžete částečně obejít tím, že vynutíte u všech prvků dvojité uvozovky, což můžete udělat pomocí replace . a pak jsou povoleny všechny tyto příklady:

declare
  arr dbms_utility.uncl_array;
  len binary_integer;
begin
  dbms_utility.comma_to_table('"USER","TABLE","42TAB"', len, arr);
end;
/

anonymous block completed

Pro svůj kód tedy upravte iv_raw při předávání a poté z každé vrácené hodnoty odstraňte dvojité uvozovky:

FUNCTION comma_to_table(iv_raw IN VARCHAR2)
  RETURN bind_tab_typ
  PIPELINED
  IS
     ltab_lname dbms_utility.lname_array;
     ln_len     BINARY_INTEGER;
  BEGIN
     dbms_utility.comma_to_table(list   => '"' || replace(iv_raw, ',', '","') || '"'
                                ,tablen => ln_len
                                ,tab    => ltab_lname);
     FOR i IN 1 .. ln_len LOOP
        PIPE ROW (replace(ltab_lname(i), '"'));
     END LOOP;
  END comma_to_table;

Pak to funguje:

select * from table(ui_util.comma_to_table('USER,TABLE,42T'));

COLUMN_VALUE
--------------------
USER
TABLE
42T

Stále však platí omezení, že každý prvek má 30 nebo méně znaků, protože to je omezení i na identifikátory v uvozovkách.




  1. Nedostatečná oprávnění PL/SQL v rámci dotazu jsou možná ručně

  2. SAS/Připojte se k Oracle pomocí rsubmit

  3. Aktualizační sekvence pro konkrétní stav - Oracle

  4. nejúčinnější způsob, jak přidat index do velké tabulky mysql