2009-02-26 7 views
2

J'ai entendu dire que c'est une bonne pratique de définir vos enregistrements en PL/SQL en utilisant l'attribut% ROWTYPE. Cela économise la frappe et permet à votre paquet de continuer à fonctionner même lorsqu'une colonne est ajoutée ou supprimée. (Corrigez-moi si je me trompe!)PL/SQL: Meilleure pratique pour récupérer deux tables jointes ou plus à partir d'un curseur?

Cependant, quand je cherche à partir d'un curseur qui implique une jointure, je trouve que je dois aller chercher dans un enregistrement programmé qui comprend un (assez long) liste manuscrite de chaque colonne retournée par la jointure.

Ma question est la suivante: Est-il possible d'aller chercher dans les dossiers imbriqués, ou chercher dans une liste d'enregistrements, ou faire quelque chose pour éviter un tel bidouille laid? Tout ce que j'ai essayé conduit à une erreur sur l'enregistrement ne correspondant pas à ce qui est retourné par le curseur.

Renvoyer le résultat d'une jointure à l'aide d'un curseur me semble être un cas d'utilisation si courant qu'il est étrange que rien de ce qui vient de là ne se présente dans une recherche.

Merci.

+0

Je suppose que vous dites "même quand une ligne est ajoutée ou supprimée". vous vouliez dire "même quand une colonne est ajoutée ou supprimée". –

+1

C'est assez loin d'un kludge. C'est exactement comme ça que ça doit fonctionner. –

Répondre

8

Vous pouvez utiliser le curseur% rowtype.

Exemple:

declare 
cursor c_c is 
select emp.*, dept.* -- use aliasses if columns have same name 
from emp 
, dept; -- for sample no join condition 

r_c c_c%rowtype; 

begin 
    for r_c in c_c loop -- with for loop even the definition of r_c is not needed. 
    ... 
    end loop; 
end; 
/
+0

Wow! Tu gères. Je n'aurais jamais pensé à ça. Merci. –

+1

Dans l'exemple d'utilisation que vous donnez (pour r_c dans c_c ...), il n'est même pas nécessaire de déclarer la variable r_c ou son type. La boucle for le fait implicitement. Mais si vous avez besoin de faire des FETCH explicites, c'est certainement utile. –

5

Pourquoi même pris la peine avec la déclaration du curseur?

Ceci est équivalent.

begin 
    for r_c in (select emp.*, dept.* from emp, dept) loop 
    ... 
    end loop; 
end; 

Je vois dans votre commentaire que vous mentionnez ceci. Mais je vois la syntaxe du curseur explicite tellement utilisée, je pense qu'il est important de montrer.

Questions connexes