2010-10-21 7 views
0

Comment utiliser array (Varray) dans la procédure de stockage. En fait, j'ai fait une procédure stockée à partir de laquelle je récupère une liste d'éléments.Comment remplir un tableau dans une procédure stockée Oracle?

Par exemple:

create or replace procedure GetTargetFields (fileformat in varchar2, 
               filefields out Varray(4)) 
IS 

BEGIN 

SELECT id 
    INTO filefields 
    FROM tablename; 

END; 

Répondre

3

utilisation BULK COLLECT INTO:

SQL> CREATE OR REPLACE TYPE vrray_4 AS VARRAY(4) OF VARCHAR2(10); 
    2/

Type created 
SQL> CREATE OR REPLACE PROCEDURE GetTargetFields(fileformat IN VARCHAR2, 
    2            filefields OUT vrray_4) IS 
    3 BEGIN 
    4  SELECT dummy BULK COLLECT INTO filefields FROM dual; 
    5 END; 
    6/

Procedure created 
SQL> DECLARE 
    2  x vrray_4; 
    3 BEGIN 
    4  GetTargetFields(NULL, x); 
    5 END; 
    6/

PL/SQL procedure successfully completed 

Assurez-vous également que votre requête ne retourne pas plus de 4 lignes (pour un VARRAY(4)) ou vous courrez dans ORA-22165

1

Deux choses:

Vous devez déclarer un type nommé - vous ne pouvez pas utiliser directement VARRAY dans une déclaration de paramètre. (Sauf si cela a changé dans 11g.)

Vous devez utiliser BULK COLLECT pour utiliser une requête unique pour remplir une collection.

Exemple:

CREATE TYPE fieldlist AS VARRAY(4) OF NUMBER; 
CREATE PROCEDURE GetTargetFields(filefields OUT fieldlist) 
    AS 
    BEGIN 
    SELECT id BULK COLLECT INTO filefields FROM tablename; 
    END; 
2

Niraj. Vous devriez utiliser les principes fournis par Vincent, mais je vous suggère d'utiliser le type de table imbriquée au lieu de varray au cas où vous n'avez pas besoin exactement de de type varray dans votre logique. Cela vous sauvera de l'erreur ORA-22165 si la requête renvoie plus de 4 lignes - le tableau imbriqué sera automatiquement étendu à la taille requise. Vous définissez le type de tableau imbriqué comme suit:

declare 
    type TStrTab is table of varchar2(10); 
    fStrTab TStrTab := TStrTab(); 
begin 
    select ... bulk collect into fStrTab from... 
end; 

Plus d'informations sur les types de collecte PL/SQL se trouve dans le Guide de fonctionnaire Oracle PL-SQL et référence Chapter 5.

+1

+1: conseil judicieux. Dans mon expérience les tables imbriquées ont une plus large gamme d'applications que varrays (parce que vous n'avez pas besoin de connaître la taille maximale). –

Questions connexes