Curseurs #
La notation des variables curseurs est quelque peu différente entre Oracle et PostgreSQL.
Déclaration des curseurs #
Sous Oracle, on déclare un curseur de cette façon : CURSOR moncurseur
. Il
est nécessaire d’inverser cette déclaration pour la rendre compatible avec
PostgreSQL : moncurseur CURSOR
. Ce cas est traité par Ora2Pg.
Les curseurs de type REF CURSOR
et SYS_REFCURSOR
sous Oracle doivent
également être modifiés en REFCURSOR
sous PostgreSQL.
Sous Oracle, le mot clé IN
dans la déclaration des curseurs permet de passer
des paramètres au curseur. Ce mot clé est inutile avec PostgreSQL, il suffit de
la supprimer.
La déclaration suivante pour Oracle :
CURSOR curs_lignes_commande(no_cde IN VARCHAR2) IS
SELECT * FROM lignes_commande
WHERE num_cde = no_cde;
doit être transposé de cette façon pour PostgreSQL :
curs_lignes_commande CURSOR (no_cde VARCHAR) FOR
SELECT * FROM lignes_commande
WHERE num_cde = no_cde;
Références :
Retour d’un curseur #
Le type retourné lors de la manipulation des curseurs est un enregistrement
RECORD
et non pas nom_curseur%ROWTYPE
sous Oracle. Avec PostgreSQL, il
est possible à la lecture du curseur de placer cet enregistrement dans une cible
qui peut être une variable ligne, une variable record
ou une liste de variables
simples séparées par des virgules.
Par exemple, la déclaration d’une référence sur un curseur se fait de la façon suivante sous Oracle :
TYPE return_cur IS REF CURSOR RETURN ma_table%ROWTYPE;
p_retcur return_cur;
Alors que, sous PostgreSQL, cela s’écrit de la sorte :
return_cur REFCURSOR;
Sortie d’un curseur #
Enfin, le code de sortie d’un curseur doit être modifié. La construction Oracle
EXIT WHEN ...%NOTFOUND
n’est pas reconnue par PostgreSQL. Elle doit être
remplacée par une construction de ce type : IF NOT FOUND THEN EXIT; END IF;
.
La construction SQL%NOTFOUND
est également à remplacer par NOT FOUND
.
Ces deux transformations sont prises en compte par Ora2Pg.
L’extrait de code PL/SQL suivant :
LOOP
FETCH c1 INTO my_ename, my_sal, my_hiredate;
EXIT WHEN c1%NOTFOUND;
...
END LOOP;
doit être transposé de la façon suivante :
LOOP
FETCH c1 INTO my_ename, my_sal, my_hiredate;
IF NOT FOUND THEN
EXIT;
END IF;
...
END LOOP;