Come può riempire una variabile di mio tipo di dati creata all'interno di Oracle PL / SQL?
-
04-10-2019 - |
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
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