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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top