Domanda

In Oracle Ho creato un tipo di dati:

TABLE of VARCHAR2(200)

Voglio avere una variabile di questo tipo all'interno di una stored procedure (definito localmente, non come una tabella effettiva nel DB) e riempirlo con i dati.

Alcuni campioni on-line mostrano come userei il mio tipo, se è stato riempito e passato come parametro per la stored procedure:

SELECT column_value currVal FROM table(pMyPassedParameter)

Comunque quello che voglio è quello di riempire durante il codice PL / SQL per sé, con le istruzioni INSERT.

Chiunque conosce la sintassi di questo?

EDIT: mi avrebbe dovuto chiarire: il mio dati di origine viene inserito come parametro VARCHAR2 passato alla stored procedure: un separatore (come la virgola) stringa delimitata. Sto già scorrendo la stringa delimitata per ottenere ogni valore separato -. Vorrei INSERIRE ognuno nel mio tipo di modo che io possa trattarlo come un tavolo per il resto della logica

È stato utile?

Soluzione

  

"Io voglio è quello di riempire durante il PL / SQL   codice stesso, con le istruzioni INSERT "

E 'come la compilazione di qualsiasi altra variabile PL / SQL: dobbiamo usare INTO. Solo perché stiamo popolando più righe abbiamo bisogno di usare la sintassi COLLECT MASSA.

declare
    l_array your_nested_table_type;
begin
    select col1
    bulk collect into l_array
    from t72;
end;
/

Se il set di risultati restituisce un sacco di dischi è una buona idea quella di utilizzare la clausola LIMIT all'interno di un ciclo. Questo perché le collezioni PL / SQL - proprio come ogni altra variabile PL / SQL - sono tenuti in memoria della sessione. Quindi non vogliamo la matrice per ottenere troppo grande, altrimenti potrebbe saltare il PGA. Scopri informazioni .

modifica

  

"Ho curato la questione di chiarire   in particolare quello che voglio "

sospirare creazione di token una stringa è una questione del tutto diversa. Ho già postato soluzioni in due thread SO. Se stai usando 9i o l'uso in precedenza questo approccio . In caso contrario, utilizzare questa soluzione regex (in realtà questo divide la stringa in token numerici, ma è abbastanza facile da convertire in caratteri).

modifica 2

  

"Io voglio solo essere in grado di utilizzare il   tipo "internamente" (all'interno memorizzato   Procedura) con l'aggiunta di valori ad esso. È   questo qualcosa che posso fare con il primo   Link? "

Certo. Perché no?

SQL> declare
  2      local_array tok_tbl;
  3  begin
  4      local_array := parser.my_parse('Keith Pellig,Peter Wakeman,Ted Bentley,Eleanor Stevens');
  5      local_array.extend();
  6      local_array(5) := 'Reese Verrick';
  7      for i in local_array.first()..local_array.last()
  8      loop
  9          dbms_output.put_line(local_array(i));
 10      end loop;
 11  end;
 12  /
Keith Pellig
Peter Wakeman
Ted Bentley
Eleanor Stevens
Reese Verrick

PL/SQL procedure successfully completed.

SQL>

Qui ho riutilizzato il mio tipo SQL, ma avrebbe funzionato altrettanto bene se TOK_TBL sono stati dichiarati nel pacchetto PL / SQL, invece.

Altri suggerimenti

non si menziona se il tipo si è creato è un tipo SQL o un tipo PL / SQL. Essi sono utilizzati in modo simile in PL / SQL così vi assumerà si è creato un tipo SQL con un comando come questo:

SQL> CREATE TYPE tab_varchar IS TABLE of VARCHAR2(200);
  2  /

Type created

Questa è una nested-tavolo. Scopri come manipolare le collezioni in PL / SQL è nella documentazione, ad esempio:

SQL> DECLARE
  2     lt tab_varchar;
  3  BEGIN
  4     /* initialization */
  5     lt := tab_varchar('a', 'b', 'c');
  6     /* adding elements */
  7     lt.extend(1);
  8     lt(4) := 'd';
  9     FOR i IN lt.FIRST .. lt.LAST LOOP
 10        dbms_output.put_line('lt(' || i || ')=' || lt(i));
 11     END LOOP;
 12  END;
 13  /

lt(1)=a
lt(2)=b
lt(3)=c
lt(4)=d
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top