Comment remplir une variable de mon propre créé le type de données dans Oracle PL / SQL?
-
04-10-2019 - |
Question
Dans Oracle, j'ai créé un type de données:
TABLE of VARCHAR2(200)
Je veux avoir une variable de ce type dans une procédure stockée (définie localement, et non comme une table réelle dans le DB) et le remplir avec des données.
Certains échantillons en ligne montrent comment j'utiliser mon type si elle a été rempli et passé en paramètre à la procédure stockée:
SELECT column_value currVal FROM table(pMyPassedParameter)
Mais ce que je veux est de le remplir pendant le code PL / SQL lui-même, avec des déclarations INSERT.
Tout le monde connaît la syntaxe de cela?
EDIT: Je aurais dû préciser: mes données source est entré comme paramètre VARCHAR2 passé à la procédure stockée: un séparateur (comme une virgule) chaîne délimitée. Je suis déjà itérer la chaîne Délimité pour obtenir chaque valeur distincte -. Je voudrais insérer chacun dans mon genre pour que je puisse le traiter comme une table pour le reste de la logique
La solution
"Je veux est de le remplir au cours de la PL / SQL code lui-même, avec INSERT "
Il est comme peuplant toute autre variable PL / SQL: nous devons utiliser INTO. Seulement parce que nous peuplant plusieurs lignes, nous devons utiliser la syntaxe BULK COLLECT.
declare
l_array your_nested_table_type;
begin
select col1
bulk collect into l_array
from t72;
end;
/
Si le jeu de résultats renvoie un grand nombre d'enregistrements, il est une bonne idée d'utiliser la clause LIMIT dans une boucle. En effet, les collections PL / SQL - tout comme toutes les autres variables PL / SQL - sont conservés en mémoire de session. Nous ne voulons donc pas le tableau pour obtenir trop grand, sinon il pourrait souffler la PGA. Découvrez plus .
modifier
"Je modifié la question de clarifier plus précisément ce que je veux "
soupir tokenizing une chaîne est une question tout à fait différente. Je l'ai déjà posté des solutions dans deux threads SO. Si vous utilisez 9i ou de l'utilisation antérieure cette approche . Sinon, utilisez cette solution regex (en fait ce divise la chaîne en jetons numériques, mais il est assez facile à convertir en caractères).
modifier 2
"Je veux seulement être en mesure d'utiliser la type « interne » (dans le Stocké Marche à suivre) en ajoutant des valeurs à elle. Est ce que je peux faire avec le premier lien? "
Bien sûr. Pourquoi pas?
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>
Ici, je l'ai re-utilisé mon type SQL, mais il serait tout aussi bien si TOK_TBL
ont été déclarés dans le package PL / SQL à la place.
Autres conseils
vous ne mentionnez pas si le type que vous avez créé est un type SQL ou un type PL / SQL. Ils sont utilisés de façon similaire dans Pl / SQL donc je suppose que vous avez créé un type SQL avec une commande comme ceci:
SQL> CREATE TYPE tab_varchar IS TABLE of VARCHAR2(200);
2 /
Type created
Ceci est une table imbriquée. Découvrez comment manipuler des collections en PL / SQL dans la documentation, par exemple:
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