Oracle
 sql >> Base de données >  >> RDS >> Oracle

Type de données d'enregistrement basé sur le curseur avec le curseur renvoyant plusieurs valeurs dans la base de données Oracle

Nous avons déjà vu dans le didacticiel précédent comment créer une variable de type d'enregistrement basée sur un curseur basée sur un curseur simple qui renvoie une seule ligne de données. Maintenant, la question qui se pose ici est de savoir si nous pouvons utiliser la même variable de type de données d'enregistrement unique avec le curseur qui renvoie plusieurs lignes de données ? Pour connaître la réponse, lisez et apprenez à gérer plusieurs valeurs renvoyées par un curseur à l'aide d'une variable de type de données d'enregistrement basée sur un curseur unique.

Comme nous traitons avec des enregistrements basés sur le curseur, une petite connaissance du curseur est donc nécessaire. Par souci de simplicité et pour rendre ce concept facile à comprendre, j'utiliserai un curseur explicite simple pour la démonstration.

Étape 1 :Déclarer un curseur explicite simple

Un type de données d'enregistrement basé sur un curseur nécessite un curseur déjà créé. Ce curseur deviendra une base sous-jacente pour notre variable de type d'enregistrement. Tous les champs de la variable de type d'enregistrement créée à l'aide de ce curseur auront le même nom et le même type de données que ceux des colonnes utilisées dans la SELECT-List du curseur.

SET SERVEROUTPUT ON;
DECLARE
 CURSOR cur_RebellionRider IS
 SELECT first_name, salary FROM employees 
 WHERE employee_id > 200;

Contrairement au curseur du didacticiel précédent qui renvoie une seule ligne de données, ce curseur renverra plusieurs lignes. Toutes ces lignes contiendront le prénom et le salaire de tous les employés dont l'ID est supérieur à 200.

Étape 2 :Déclarez la variable de type de données d'enregistrement basé sur le curseur

Comme nous avons créé le curseur, nous sommes maintenant tous prêts à déclarer notre variable d'enregistrement à l'aide de ce curseur.

var_emp    cur_RebellionRider%ROWTYPE;

Var_emp est la variable de type d'enregistrement et comme elle est basée sur le curseur cur_RebellionRider, nous pouvons donc l'appeler fièrement une variable de type d'enregistrement basée sur le curseur. Nous devons maintenant voir si cette variable d'enregistrement unique est capable de contenir toutes les données renvoyées par le curseur sous-jacent cur_RebellionRider.

Étape 3 :Initialiser la variable d'enregistrement du curseur

Comme nous l'avons vu dans le didacticiel PL/SQL 34, l'initialisation d'une variable d'enregistrement consiste à lui attribuer certaines valeurs. En cas de curseurs, l'instruction FETCH-INTO effectue ce travail. Mais nous devons nous assurer que nous avons correctement suivi le cycle de vie du curseur.

Si vous ne savez pas quel est ce cycle de vie de curseur et les étapes impliquées dans la création d'un curseur, consultez ce blog sur "Introduction au curseur de base de données".

BEGIN
   OPEN cur_RebellionRider; 
  LOOP 
    FETCH cur_RebellionRider INTO var_emp;  
    EXIT WHEN cur_RebellionRider%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary );
  END LOOP;--Simple Loop End
  CLOSE cur_RebellionRider;
END;

La section d'exécution ci-dessus du bloc PL/SQL que nous créons ici a été expliquée ligne par ligne dans le didacticiel vidéo sur ma chaîne YouTube. Vérifiez cela.

Alors c'est tout. C'est tout ce que nous devons faire. Maintenant, combinons tous ces morceaux de code que nous avons vus dans les différentes étapes ci-dessus en un seul bloc PL/SQL anonyme.

Variable de type de données d'enregistrement basée sur le curseur dans la base de données Oracle

SET SERVEROUTPUT ON;
DECLARE
  CURSOR cur_RebellionRider IS
  SELECT first_name, salary FROM employees
  WHERE employee_id > 200; 
  var_emp   cur_RebellionRider%ROWTYPE;
BEGIN
  OPEN cur_RebellionRider;
  LOOP
    FETCH cur_RebellionRider INTO var_emp;
    EXIT WHEN cur_RebellionRider%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary);
  END LOOP;
  CLOSE cur_RebellionRider;
END;

Lorsque vous compilez et exécutez le code ci-dessus, vous obtiendrez toutes les données que l'instruction FETCH-INTO a extraites du curseur cur_RebellionRider et stockées dans la variable d'enregistrement basée sur le curseur var_emp. Cela implique que nous pouvons effectivement gérer plusieurs lignes de données à l'aide d'un seul enregistrement basé sur le curseur.

Dans mon didacticiel vidéo PL/SQL, j'ai demandé si nous pouvions simplifier ce code ou existe-t-il un autre moyen d'effectuer la même tâche. La réponse est oui, il existe plusieurs façons d'obtenir le même résultat et l'une d'entre elles consiste à utiliser "Cursor For-Loop". Il s'agit d'un type spécial de boucle qui déclare la variable d'enregistrement ainsi qu'ouvre, récupère et ferme implicitement le curseur sous-jacent en arrière-plan pour vous. Vous pouvez en savoir plus sur Cursor For-Loop ici.

Lien de référence pour SQL Expert 1z0-047 Lien d'affiliation
Guide d'examen d'expert certifié OCA Oracle Database SQL (examen 1Z0-047)

Voici le code réalisé à l'aide de Cursor For-Loop qui équivaut au code ci-dessus. Comme vous pouvez le voir, c'est beaucoup moins complexe avec peu de lignes de codes (LOC).

SET SERVEROUTPUT ON;
BEGIN
  FOR var_emp IN (SELECT first_name, salary FROM employees
 WHERE employee_id >200)
  LOOP
    DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary);
  END LOOP;
END; 

Les deux codes renverront le même résultat car les deux font la même tâche.

J'espère que vous avez apprécié ce tutoriel détaillé sur PL/SQL. Assurez-vous de partager ceci sur vos réseaux sociaux et de me taguer car je donne chaque mois la marchandise de RebellionRider à un utilisateur sélectionné au hasard. Suivez-moi également sur mes réseaux sociaux [Twitter/Facebook/Instagram] pour des mises à jour régulières.

Merci et bonne journée !