Curseur de documents dans PostgreSQL
Je suis en train d'utiliser les curseurs pour une requête qui joint plusieurs tables. J'ai vu que pour oracle, il y a un curseur à l'enregistrement de base. Quand j'ai essayer la même chose pour Postgres, il lève une erreur. Comment puis-je faire la même chose dans Postgres?
CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$BODY$
DECLARE
xyz CURSOR FOR select * from address ad
join city ct on ad.city_id = ct.city_id;
xyz_row RECORD;
BEGIN
open xyz;
LOOP
fetch xyz into xyz_row;
exit when xyz_row = null;
if xyz_row.city like '%hi%' then
return next xyz_row.city;
end if;
END LOOP;
close xyz;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
D'erreur que je reçois est:
ERROR: relation "xyz" does not exist CONTEXT: compilation of PL/pgSQL function "avoidable_states" near line 4
OriginalL'auteur Zeus | 2014-03-12
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser la
RECORD
type:J'ai mis à jour la réponse à montrer ce que vous voulez. Voir Erwin réponse, car il vous montre quelques autres (et généralement mieux à mon humble avis) les moyens de l'itération sur une requête, bien que parfois nous avons besoin d'un curseur, donc...
OriginalL'auteur MatheusOl
1. Curseur implicite
Il est presque toujours préférable d'utiliser le curseur implicite d'un
boucle que de recourir à un peu plus lent et lourd explicite curseur. J'ai écrit des milliers de plpgsql fonctions et seulement une main plein de fois explicite curseurs fait sens.
De côté: il n'y a rien dans la fonction qui aurait besoin de la volatilité des
VOLATILE
. UtilisationSTABLE
.2. Définir l'approche basée
Il est presque toujours préférable d'utiliser une approche fondée sur les si possible. Utilisation
RETURN QUERY
de revenir en tant que jeu à partir d'une requête directement.3. Fonction SQL
Pour le cas simple (probablement une simplification), vous pouvez également utiliser un simple Fonction SQL ou même simplement la requête:
Je suis venue à partir d'un Oracle PL/SQL d'arrière-plan, et je me demandais si il existe un moyen de "cacher" le curseur implicite dans le
DECLARE
partie de la fonction, puis de référence uniquement par curseur-nom dans leFOR
boucle? Accordée que lorsque vous sélectionnez l'instruction n'est qu'à quelques lignes de code, il ne fait pas beaucoup de différence. Mais si leSELECT
déclaration est de 50 lignes de code, alors c'est vraiment distrayant (à des fins de débogage) pour inclure SQL dans le code procédural.OriginalL'auteur Erwin Brandstetter