2011-02-23 3 views
1

J'ai cette requêtemise à jour DBMS_SQL.Execute et VRAC - Besoin d'aide

select col1, col2 de table où critera =: criteria_var

La requête particulière a été utilisée dans DBMS_SQL pour ouvrir curseur et BIND les variables. Les valeurs sont ensuite récupérées par les fonctions DBMS_SQL qui mettent alors à jour une autre table. mais cela se passe une rangée à la fois.

Je veux utiliser BULK FETCH INTO. J'ai lu les tutoriels, mais je ne pouvais pas trouver anythign où je peux utiliser BULK FETCH INTO avec DBMS_SQL.

est-ce possible? si oui, alors comment?

Répondre

1

Vous pouvez utiliser la procédure BIND_ARRAY dans le package DBMS_SQL pour effectuer une extraction en bloc. Il y a an example of this dans la documentation DBMS_SQL.

À moins d'un besoin particulier d'utiliser DBMS_SQL, cependant, (et en supposant SQL dynamique est réellement nécessaire en premier lieu), il semble probable que ce serait plus facile à utiliser SQL dynamique natif, à savoir

EXECUTE IMMEDIATE 'SELECT col1, col2 FROM tableName WHERE criteria = :1' 
    BULK COLLECT INTO l_col1_collection, l_col2_collection 
    USING l_criteria_variable; 

Si vous extrayez simplement les données de cette requête afin de mettre à jour une table différente, il serait plus efficace de laisser Oracle faire cela en construisant une seule instruction UPDATE qui a utilisé cette requête pour récupérer plusieurs lignes. Quelque chose comme

UPDATE destination_table dest 
    SET (col1, col2) = (SELECT col1, col2 
         FROM source_table_name src 
         WHERE criteria = l_criteria_variable 
          AND src.key_column = dest.key_column) 
WHERE EXISTS(SELECT 1 
       FROM source_table_name src 
       WHERE criteria = l_criteria_variable 
        AND src.key_column = dest.key_column) 
+0

instruction de mise à jour unique? Que veux-tu dire par là. Je suis Noob dans Pl/SQL .. –

+1

@alee - OK. Alors laissez-moi prendre du recul. Pourquoi avez-vous besoin d'utiliser SQL dynamique (et le package DBMS_SQL)? Ne connaissez-vous pas le nom de la table au moment de la compilation, par exemple? –

+0

Je connais la table d'où récupérer les données. Les valeurs de colonnes données seront mises à jour dans une autre table via un ** dblink **. le dernier code que vous avez écrit (déclaration de mise à jour unique), ne serait pas lent? par rapport à la mise à jour en vrac ou quelque chose? –

Questions connexes