PL/SQL: Manipulation des curseurs

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Listen to an AI-generated conversation about this lesson
Download our mobile app to listen on the go
Get App

Questions and Answers

Quelle est la définition correcte d'un curseur en PL/SQL?

  • Un curseur est une instruction DML qui modifie les données.
  • Un curseur est un pointeur vers le jeu de résultats d'une requête SQL. (correct)
  • Un curseur est une fonction qui exécute des requêtes SQL.
  • Un curseur est une variable qui stocke des données temporaires.

Dans quel cas un curseur implicite est-il utilisé?

  • Pour la gestion des transactions SQL.
  • Pour les requêtes complexes nécessitant une gestion manuelle des résultats.
  • Pour toutes les instructions DML et les requêtes retournant une seule ligne. (correct)
  • Pour les opérations de sauvegarde et de restauration de bases de données.

Quelle est l'utilité de la commande OPEN dans la manipulation des curseurs?

  • Elle ferme le curseur et libère la mémoire.
  • Elle vérifie si le curseur est déjà ouvert.
  • Elle extrait les données du curseur vers des variables.
  • Elle alloue de la mémoire pour le jeu de résultats du curseur. (correct)

Quel attribut de curseur indique si la dernière opération d'extraction a retourné au moins une ligne?

<p><code>%FOUND</code> (A)</p>
Signup and view all the answers

Que fait l'attribut %ROWCOUNT d'un curseur?

<p>Il compte le nombre de lignes extraites jusqu'à présent. (B)</p>
Signup and view all the answers

Quelle est la principale différence entre une boucle FOR standard et une boucle FOR utilisant un curseur?

<p>La boucle <code>FOR</code> avec curseur gère automatiquement l'ouverture, l'extraction, la vérification de sortie, et la fermeture du curseur. (C)</p>
Signup and view all the answers

Quelle est la syntaxe correcte pour déclarer un curseur paramétré?

<p><code>CURSOR nom_du_curseur (param1 type, param2 type,...) IS requête_SELECT_utilisant_les_paramètres;</code> (D)</p>
Signup and view all the answers

Pourquoi est-il recommandé de toujours fermer les curseurs après utilisation?

<p>Pour libérer les ressources système et éviter les problèmes de performance. (C)</p>
Signup and view all the answers

Quel type de boucle est le plus approprié pour une gestion automatique des curseurs?

<p>Boucle <code>FOR</code> avec curseur (A)</p>
Signup and view all the answers

Dans quel cas est-il judicieux d'utiliser les enregistrements %ROWTYPE?

<p>Pour simplifier la déclaration des variables en se basant sur la structure d'une table ou d'un curseur. (A)</p>
Signup and view all the answers

Parmi les composants SQL suivants, lequel fait partie du Langage de Définition de Données (LDD)?

<p>CREATE (C)</p>
Signup and view all the answers

Quelle commande SQL est utilisée pour modifier la structure d'une table existante?

<p>ALTER TABLE (B)</p>
Signup and view all the answers

Quelle contrainte assure qu'une colonne ne contiendra jamais de valeurs NULL?

<p>NOT NULL (A)</p>
Signup and view all the answers

Quelle est l'utilité d'une vue (VIEW) en SQL?

<p>Elle permet de définir une requête stockée qui peut être traitée comme une table. (A)</p>
Signup and view all the answers

Quel est le but principal d'une séquence en SQL?

<p>Générer automatiquement des valeurs numériques uniques. (B)</p>
Signup and view all the answers

Dans quel contexte utilise-t-on les opérateurs ensemblistes tels que UNION, INTERSECT, et MINUS?

<p>Pour combiner les résultats de plusieurs requêtes <code>SELECT</code>. (D)</p>
Signup and view all the answers

Quelle est la différence entre UNION et UNION ALL?

<p><code>UNION</code> supprime les doublons, tandis que <code>UNION ALL</code> conserve tous les résultats. (B)</p>
Signup and view all the answers

Comment peut-on inclure une requête SELECT à l'intérieur d'une autre requête (sous-requête)?

<p>En plaçant la requête <code>SELECT</code> entre parenthèses. (C)</p>
Signup and view all the answers

Quelle est la structure de base d'un bloc PL/SQL?

<p><code>DECLARE ... BEGIN ... EXCEPTION ... END;</code> (C)</p>
Signup and view all the answers

Quel type de variable est utilisé pour stocker un curseur dans PL/SQL?

<p><code>REF CURSOR</code> (C)</p>
Signup and view all the answers

Flashcards

Qu'est-ce qu'un curseur?

Un pointeur vers le jeu de résultats d'une requête SQL.

Curseurs implicites

Déclarés et gérés automatiquement par Oracle pour les instructions DML ou les requêtes à une seule ligne.

Curseurs explicites

Déclarés et gérés par le programmeur pour les requêtes renvoyant plusieurs lignes.

Ouverture d'un curseur

Alloue de la mémoire pour le jeu de résultats.

Signup and view all the flashcards

Extraction des données (FETCH)

Récupère les valeurs de la ligne courante dans des variables et déplace le pointeur vers la ligne suivante.

Signup and view all the flashcards

Fermeture d'un curseur

Libère la mémoire allouée.

Signup and view all the flashcards

%ISOPEN

Booléen indiquant si le curseur est ouvert.

Signup and view all the flashcards

%FOUND

Booléen indiquant si la dernière extraction a réussi.

Signup and view all the flashcards

%NOTFOUND

Booléen indiquant si la dernière extraction a échoué (plus de lignes).

Signup and view all the flashcards

%ROWCOUNT

Nombre de lignes extraites jusqu'à présent.

Signup and view all the flashcards

Curseurs Paramétrés

Permettent de passer des paramètres pour personnaliser les résultats des requêtes.

Signup and view all the flashcards

UNION

Combine les résultats, supprime les doublons.

Signup and view all the flashcards

UNION ALL

Combine les résultats, conserve les doublons.

Signup and view all the flashcards

INTERSECT

Renvoie les lignes communes.

Signup and view all the flashcards

MINUS

Renvoie les lignes de la première requête absentes de la seconde.

Signup and view all the flashcards

Study Notes

Curseurs PL/SQL

  • Un curseur est un pointeur vers le jeu de résultats d'une requête SQL.

Types de Curseurs

  • Les curseurs implicites sont automatiquement déclarés et gérés par Oracle pour les instructions DML et les requêtes à une seule ligne.
  • Les curseurs explicites sont déclarés et gérés par le programmeur, pour les requêtes renvoyant plusieurs lignes.

Manipulation des Curseurs

  • Déclaration : CURSOR nom_du_curseur IS requête_SELECT;
    • Exemple: CURSOR curseur_emp IS SELECT employee_id, last_name FROM employees WHERE department_id = 100;
  • Ouverture : OPEN nom_du_curseur;
    • Alloue de la mémoire pour le jeu de résultats.
    • Aucune exception n'est levée si la requête ne renvoie aucune ligne.
  • Extraction des données : FETCH nom_du_curseur INTO liste_de_variables|nom_de_l_enregistrement;
    • Récupère les valeurs de la ligne courante dans des variables.
    • Déplace le pointeur vers la ligne suivante.
  • Fermeture : CLOSE nom_du_curseur;
    • Libère la mémoire allouée et le curseur peut être rouvert après fermeture.

Attributs des Curseurs

  • %ISOPEN : Booléen indiquant si le curseur est ouvert.
  • %FOUND : Booléen indiquant si la dernière extraction a réussi.
  • %NOTFOUND : Booléen indiquant si la dernière extraction a échoué (plus de lignes).
  • %ROWCOUNT : Nombre de lignes extraites jusqu'à présent.
  • Exemple d'utilisation :
IF curseur_emp%ISOPEN THEN
    DBMS_OUTPUT.PUT_LINE('Lignes traitées : ' || curseur_emp%ROWCOUNT);
END IF;

Utilisation d'Enregistrements %ROWTYPE

  • Déclaration :
DECLARE
    CURSOR curseur_emp IS SELECT employee_id, last_name FROM employees;
    enregistrement_emp curseur_emp%ROWTYPE;
BEGIN
    OPEN curseur_emp;
    LOOP
        FETCH curseur_emp INTO enregistrement_emp;
        EXIT WHEN curseur_emp%NOTFOUND;
        -- Accéder aux champs via enregistrement_emp.employee_id, enregistrement_emp.last_name
    END LOOP;
    CLOSE curseur_emp;
END;

Boucle FOR avec Curseur

  • Déclaration la plus simple :
DECLARE
    CURSOR curseur_emp IS SELECT employee_id, last_name FROM employees;
BEGIN
    FOR enregistrement_emp IN curseur_emp LOOP
        -- Ouverture, extraction, vérification de sortie et fermeture automatiques
        -- Accéder aux champs via enregistrement_emp.employee_id, enregistrement_emp.last_name
    END LOOP;
END;

Boucle FOR avec Sous-requête

  • Méthode plus concise :
BEGIN
    FOR enregistrement_emp IN (SELECT employee_id, last_name FROM employees) LOOP
        -- Gestion automatique du curseur
        -- Accéder aux champs via enregistrement_emp.employee_id, enregistrement_emp.last_name
    END LOOP;
END;    

Curseurs Paramétrés

  • Permettent de passer des paramètres pour personnaliser les résultats des requêtes.
  • Syntaxe : CURSOR nom_du_curseur (param1 type, param2 type,...) IS requête_SELECT_utilisant_les_paramètres;
  • Exemple :
DECLARE
    CURSOR curseur_emp_dept(dept_id NUMBER, salaire_min NUMBER) IS
    SELECT employee_id, last_name FROM employees
    WHERE department_id = dept_id AND salary > salaire_min;
BEGIN
    -- Ouverture avec des paramètres spécifiques
    FOR enregistrement_emp IN curseur_emp_dept(80, 5000) LOOP
        DBMS_OUTPUT.PUT_LINE(enregistrement_emp.last_name);
    END LOOP;
END;

Bonnes Pratiques

  • Toujours fermer les curseurs après utilisation pour libérer les ressources.
  • Utiliser les boucles FOR avec curseur lorsque possible pour une gestion automatique.
  • Vérifier les attributs des curseurs (%FOUND, %NOTFOUND) pour gérer les jeux de résultats vides.
  • Paramétrer les curseurs pour des modèles de requêtes réutilisables.
  • Utiliser les enregistrements %ROWTYPE pour simplifier les déclarations de variables.

Comparaison des Techniques de Curseurs

  • Basique : Déclaration complète, gestion manuelle, traitement complexe.
  • %ROWTYPE : Curseur + enregistrement, gestion manuelle, gestion structurée des lignes.
  • Boucle FOR : Curseur uniquement, gestion automatique, itération simple.
  • Sous-requête FOR : Aucune déclaration nécessaire, gestion automatique, requêtes ad-hoc rapides.
  • Paramétré : Curseur paramétré, gestion manuelle/automatique, requêtes réutilisables.

Composants SQL

  • LDD (Langage de Définition de Données) : CREATE, ALTER, DROP
  • LMD (Langage de Manipulation de Données) : INSERT, UPDATE, DELETE
  • LID (Langage d'Interrogation de Données) : SELECT
  • LCD (Langage de Contrôle de Données) : GRANT, REVOKE

Langage de Définition de Données (LDD) : Tables

  • Création :
CREATE TABLE nom_table (
    colonne1 type_donnees [contraintes],
    colonne2 type_donnees [contraintes],
    ...
);
  • Modification :
    • Ajouter une colonne : ALTER TABLE nom_table ADD nom_colonne type_donnees;
    • Modifier une colonne : ALTER TABLE nom_table MODIFY nom_colonne nouveau_type;
    • Supprimer une colonne : ALTER TABLE nom_table DROP COLUMN nom_colonne;
  • Suppression : DROP TABLE nom_table;
  • Renommage : RENAME ancien_nom TO nouveau_nom;

Contraintes

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • Ajout de contraintes : ALTER TABLE nom_table ADD CONSTRAINT nom_contrainte type_contrainte(colonne);
  • Suppression de contraintes : ALTER TABLE nom_table DROP CONSTRAINT nom_contrainte;

Vues

  • Création :
CREATE [OR REPLACE] VIEW nom_vue AS
SELECT colonnes FROM tables [WHERE conditions];
  • Suppression : DROP VIEW nom_vue;

Séquences

  • Création :
CREATE SEQUENCE nom_sequence
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
  • Utilisation : nom_sequence.NEXTVAL et nom_sequence.CURRVAL
  • Suppression : DROP SEQUENCE nom_sequence;

Index

  • Création : CREATE [UNIQUE] INDEX nom_index ON nom_table(colonne1, colonne2,...);
  • Suppression : DROP INDEX nom_index;

Synonymes

  • Création : CREATE [PUBLIC] SYNONYM nom_synonyme FOR nom_objet;
  • Suppression : DROP SYNONYM nom_synonyme;

Langage de Manipulation de Données (LMD) : INSERT

  • Syntaxe de base : INSERT INTO nom_table VALUES (valeur1, valeur2,...);
  • Spécification de colonnes : INSERT INTO nom_table (colonne1, colonne2,...) VALUES (valeur1, valeur2,...);
  • À partir d'une autre table :
INSERT INTO nom_table (colonne1, colonne2,...)
SELECT colonne1, colonne2,... FROM table_source [WHERE condition];

UPDATE

  • Syntaxe de base : UPDATE nom_table SET colonne1 = valeur1, colonne2 = valeur2 [WHERE condition];
  • Avec sous-requête :
UPDATE nom_table SET (colonne1, colonne2) =
(SELECT colonne1, colonne2 FROM table_source WHERE condition);

DELETE

  • Syntaxe de base : DELETE FROM nom_table [WHERE condition];
  • Avec sous-requête : DELETE FROM nom_table WHERE colonne IN (SELECT colonne FROM table_source WHERE condition);

Langage d'Interrogation de Données (LID) : SELECT

  • Syntaxe de base : SELECT [DISTINCT] colonne1, colonne2,... FROM nom_table [WHERE condition] [ORDER BY colonne1 [ASC|DESC], colonne2 [ASC|DESC],...];
  • Fonctions de caractères : LOWER(), UPPER(), SUBSTR(), LENGTH(), etc.
  • Fonctions numériques : ROUND(), TRUNC(), MOD(), POWER(), etc.
  • Fonctions de date : SYSDATE, ADD_MONTHS(), MONTHS_BETWEEN(), etc.
  • Fonctions de conversion : TO_CHAR(), TO_DATE(), TO_NUMBER()
  • Autres fonctions : NVL(), NVL2(), DECODE(), CASE, COALESCE()
  • Fonctions Analytiques
  • Group Functions
    • Functions: AVG(), COUNT(), MAX(), MIN(), SUM(), STDDEV(), VARIANCE()
    • GROUP BY: Regroupe les lignes ayant les mêmes valeurs.
    • HAVING: Filtre les groupes.

Jointures

  • Jointure interne : Renvoie les lignes lorsqu'il y a une correspondance dans les deux tables.
  • Jointures externes :
    • LEFT OUTER JOIN : Renvoie toutes les lignes de la table de gauche.
    • RIGHT OUTER JOIN : Renvoie toutes les lignes de la table de droite.
    • FULL OUTER JOIN : Renvoie toutes les lignes lorsqu'il y a une correspondance dans l'une ou l'autre table.
  • Auto-jointure : Jointure d'une table avec elle-même.
  • Jointure naturelle : Joint des tables sur des colonnes de même nom.
  • Produit cartésien : Renvoie toutes les combinaisons possibles de lignes.

Opérateurs Ensemblistes

  • UNION : Combine les résultats, supprime les doublons.
  • UNION ALL : Combine les résultats, conserve les doublons.
  • INTERSECT : Renvoie les lignes communes.
  • MINUS : Renvoie les lignes de la première requête absentes de la seconde.

Sous-requêtes

  • Sous-requêtes à une ligne : Utiliser avec =, >, <, etc.
  • Sous-requêtes à plusieurs lignes : Utiliser avec IN, ANY, ALL

PL/SQL

  • Structure de Bloc
DECLARE
    -- Déclarations de variables
BEGIN
    -- Instructions exécutables
    [EXCEPTION
        -- Gestionnaires d'exceptions]
END;

Types de Variables

  • Types scalaires : NUMBER, VARCHAR2, DATE, BOOLEAN, etc.
  • Types composites : RECORD, TABLE
  • Types référence : REF CURSOR
  • Types LOB : BLOB, CLOB, NCLOB, BFILE

Structures de Contrôle

IF condition THEN
    instructions;
ELSIF condition THEN
    instructions;
ELSE
    instructions;
END IF;
CASE variable
    WHEN valeur1 THEN instructions;
    WHEN valeur2 THEN instructions;
    ELSE instructions;
END CASE;

Boucles

LOOP
    instructions;
    EXIT WHEN condition;
END LOOP;
WHILE condition LOOP
    instructions;
END LOOP;
FOR compteur IN [REVERSE] début...fin LOOP
    instructions;
END LOOP;

SQL dans PL/SQL

SELECT colonne INTO variable FROM table WHERE condition;
  • Opérations sur les curseurs : DECLARE, OPEN, FETCH, CLOSE

Gestiion des Exceptions

EXCEPTION
    WHEN exception1 THEN
        instructions;
    WHEN exception2 THEN
        instructions;
    WHEN OTHERS THEN
        instructions;
END;

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

More Like This

Oracle PL/SQL Explicit Cursors Quiz
10 questions

Oracle PL/SQL Explicit Cursors Quiz

SimplestRainbowObsidian8987 avatar
SimplestRainbowObsidian8987
PL/SQL Cursor FOR LOOP
16 questions

PL/SQL Cursor FOR LOOP

HeroicCornflower avatar
HeroicCornflower
PL/SQL: SQL, DML, DDL Statements and Cursors
29 questions
Use Quizgecko on...
Browser
Browser