Les curseurs de PL / SQL fournissent un mécanisme pour traiter la ligne de données par ligne à partir de l'ensemble de résultats d'une requête SQL. Ils agissent comme un pointeur vers un ensemble de résultats, vous permettant de récupérer et de manipuler des lignes individuelles. Pour utiliser un curseur, vous le déclarez d'abord, puis l'ouvrez pour exécuter la requête, récupérer les lignes une à la fois et enfin la fermer. Voici une ventilation:
Déclaration: vous déclarez un curseur à l'aide du mot clé CURSOR
, suivi d'un nom et de la requête SQL. La requête doit sélectionner les colonnes que vous devez traiter.
<code class="sql">DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 10; BEGIN -- Cursor operations will go here END; /</code>
Ouverture: l'instruction OPEN
exécute la requête associée au curseur et positionne le curseur avant la première ligne.
<code class="sql">OPEN emp_cursor;</code>
Fetching: L'instruction FETCH
récupère une ligne à partir de l'ensemble de résultats et place les valeurs en variables. Vous devez déclarer des variables qui correspondent aux types de données des colonnes sélectionnées dans la requête du curseur.
<code class="sql">DECLARE employee_id employees.employee_id%TYPE; last_name employees.last_name%TYPE; salary employees.salary%TYPE; CURSOR emp_cursor IS ...; -- as declared above BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO employee_id, last_name, salary; EXIT WHEN emp_cursor%NOTFOUND; -- Process the fetched row here DBMS_OUTPUT.PUT_LINE('Employee ID: ' || employee_id || ', Name: ' || last_name || ', Salary: ' || salary); END LOOP; CLOSE emp_cursor; END; /</code>
Clôture: La déclaration CLOSE
libère les ressources détenues par le curseur. Il est crucial de fermer les curseurs pour éviter les fuites de ressources.
<code class="sql">CLOSE emp_cursor;</code>
L'attribut emp_cursor%NOTFOUND
est vérifié après chaque FETCH
. Quand plus de lignes ne sont disponibles, cela devient TRUE
et la boucle se termine. C'est le moyen standard d'itérer à travers les lignes renvoyées par un curseur.
PL / SQL offre plusieurs types de curseurs, chacun avec ses forces et ses faiblesses:
SELECT INTO
instruction. Ils sont cachés au programmeur et sont automatiquement gérés par le moteur PL / SQL. Utilisez-les pour des requêtes simples récupérant une seule ligne. Si la requête renvoie plus d'une ligne, elle soulève une exception TOO_MANY_ROWS
.Le choix dépend de vos besoins: utilisez des curseurs implicites pour des récupérations simples à une seule rangée, des curseurs explicites pour un traitement multi-rang plus complexe avec un contrôle clair et des curseurs REF pour le SQL dynamique et le passage du paramètre de procédure / fonction.
Le traitement de grands ensembles de données avec des curseurs peut être inefficace s'il n'est pas géré soigneusement. Voici quelques stratégies pour améliorer les performances:
FORALL
instructions pour effectuer des opérations sur plusieurs lignes à la fois. Cela réduit considérablement le changement de contexte entre le moteur PL / SQL et le serveur de base de données.SELECT *
, spécifiez plutôt que les colonnes nécessaires. Utilisez approprié WHERE
les clauses pour filtrer efficacement les données. Oui, vous pouvez et devez souvent utiliser FOR
boucles avec des curseurs pour simplifier votre code et améliorer la lisibilité. La boucle FOR
gère implicitement l'ouverture, la récupération et la fermeture du curseur, ce qui rend le code plus concis et plus facile à comprendre. Ceci est particulièrement bénéfique lorsqu'il s'agit de curseurs explicites.
Au lieu de la LOOP
manuelle et FETCH
comme indiqué précédemment, vous pouvez utiliser:
<code class="sql">DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 10; BEGIN FOR emp_rec IN emp_cursor LOOP DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_rec.employee_id || ', Name: ' || emp_rec.last_name || ', Salary: ' || emp_rec.salary); END LOOP; END; /</code>
Ceci FOR
la boucle gère automatiquement l'itération du curseur. La variable d'enregistrement emp_rec
reçoit automatiquement les valeurs de chaque ligne obtenue du curseur. Cette approche est plus propre, plus lisible et moins sujette aux erreurs par rapport à la gestion manuelle du curseur. C'est la méthode préférée pour la plupart des traitements de lignes basés sur le curseur dans PL / SQL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!