Maison >base de données >Oracle >qu'est-ce que le curseur Oracle

qu'est-ce que le curseur Oracle

青灯夜游
青灯夜游original
2022-02-23 11:35:0413358parcourir

Dans Oracle, le curseur est un mécanisme qui utilise le mot-clé CURSOR pour définir un ensemble de données interrogées par Oracle. L'ensemble de données interrogé peut être stocké dans la mémoire, puis le curseur pointe vers l'un des enregistrements via une boucle. Les curseurs atteignent l’objectif de parcourir des ensembles de données.

qu'est-ce que le curseur Oracle

L'environnement d'exploitation de ce tutoriel : système Windows 7, version Oracle 11g, ordinateur Dell G3.

Dans Oracle, les curseurs sont un mécanisme par lequel un nom peut être attribué à une instruction SELECT et les informations contenues dans cette instruction SQL peuvent être traitées.

Le curseur Oracle définit un ensemble d'ensembles de données interrogés par Oracle via le mot-clé CURSOR. Semblable à un tableau, l'ensemble de données interrogé est stocké dans la mémoire, puis le curseur pointe vers l'un des enregistrements et l'ensemble de données circulaire est. atteint via le but du curseur de boucle.

Que fait le curseur ?

①Spécifiez la position d'une ligne spécifique dans l'ensemble de résultats.

②Récupérez une ou plusieurs lignes consécutives en fonction de la position actuelle de l'ensemble de résultats.

③ Modifiez les données de la ligne à la position actuelle de l'ensemble de résultats.

④ Définissez différents niveaux de sensibilité aux modifications de données apportées par d'autres utilisateurs.

⑤La base de données est accessible par programme.

Type de curseur Oracle ?

1. Curseur statique : Un curseur dont l'ensemble de résultats a été confirmé (défini statiquement). Divisé en curseurs implicites et explicites

  • Curseur implicite : toutes les instructions DML sont des curseurs implicites et les informations sur les instructions SQL peuvent être obtenues via l'attribut de curseur implicite.

  • Afficher le curseur : L'utilisateur affiche le curseur déclaré, c'est-à-dire l'ensemble de résultats spécifié. Lorsqu'une requête renvoie plusieurs lignes de résultats, un curseur explicite est requis.

2. Curseur REF : un objet temporaire qui associe dynamiquement l'ensemble de résultats.

Quels sont les statuts des curseurs Oracle et comment utiliser les attributs du curseur ?

①L'état du curseur est représenté par des attributs.

  • %Found : L'état d'exécution de l'instruction Fetch (obtention des enregistrements) est True ou False.

  • %NotFound : Indique si le dernier enregistrement est extrait comme True ou False.

  • %ISOOpen : Indique si le curseur est ouvert True ou False.

  • %RowCount : Le nombre de lignes actuellement extraites par le curseur.

②Utilisez les propriétés du curseur.

Exemple :

/* conn scott/tiger */
  Begin
   Update emp Set  SAL = SAL + 0.1  Where JOB = 'CLERK';
   If  SQL%Found  Then
    DBMS_OUTPUT.PUT_LINE('已经更新!');
   Else
    DBMS_OUTPUT.PUT_LINE('更新失败!');
   End  If;
  End;

Comment utiliser le curseur d'affichage ? Comment parcourir un curseur de boucle ?

1. Utilisez le curseur d'affichage

  • pour déclarer le curseur : divisez la zone de stockage. Notez que l'instruction Select n'est pas exécutée pour le moment.

CURSOR 游标名( 参数 列表)   [返回值类型]   IS   Select 语句;
  • Ouvrez le curseur : exécutez l'instruction Select, obtenez l'ensemble de résultats et stockez-le dans le curseur. À ce moment, le curseur pointe vers la tête de l'ensemble de résultats, pas vers le premier enregistrement.

 Open 游标名( 参数 列表);
  • Obtenir un enregistrement : déplacez le curseur pour obtenir un enregistrement

Fetch  游标名InTo  临时记录或属性类型变量;
  • Fermer le curseur : placez le curseur dans le pool de mémoire tampon sans libérer complètement les ressources. Peut être rouvert.

Close  游标名;

2. Curseur de boucle traversante

  • Curseur de boucle For

Le curseur de boucle ouvre implicitement le curseur, défile automatiquement pour obtenir un enregistrement et crée automatiquement une variable de type d'enregistrement temporaire pour stocker l'enregistrement. Le curseur se ferme automatiquement après le traitement.

     For  变量名  In  游标名 
     Loop
      数据处理语句;
     End Loop;
  • Curseur de boucle de boucle

     。。。
    Loop
     Fatch  游标名InTo  临时记录或属性类型变量;
     Exit  When   游标名%NotFound;
    End   Loop;
     。。。

Exemple 1 :

/* conn scott/tiger */
   Declare
     Cursor myCur is select empno,ename,sal from emp;
     vna varchar2(10);
     vno number(4);
     vsal number(7,2);
  Begin
     open myCur;
     fetch myCur into vno,vna,vsal;
     dbms_output.put_line(vno||'    '||vna||'    '||vsal);
     close myCur;
  End;
  /

Exemple 2 : Utilisez une boucle pour parcourir le curseur.

 /* conn scott/tiger */
  Declare
     Cursor myCur is select ename,job,sal,empno from emp;
     varE myCur%rowType;
  Begin
     if myCur%isopen = false then
        open myCur;
       dbms_output.put_line('Opening...');
     end if;
     loop
        fetch myCur into varE;
        exit when myCur%notfound;
        dbms_output.put_line(myCur%rowCount||'    '||vare.empno||'    '||vare.ename||'    '||vare.sal);
     end loop;
     if myCur%isopen then
        Close myCur;
        dbms_output.put_line('Closing...');
     end if;
  End;
  /

Exemple 3 : Utiliser une boucle For pour parcourir le curseur,

  /* conn scott/tiger */
  Declare
     Cursor myCur is select * from emp;
  Begin
     for varA in myCur
      loop
         dbms_output.put_line(myCur%rowCount||'    '||varA.empno||'    '||varA.ename||'  '||varA.sal);
      end loop;
  End;
  /

Comment mettre à jour et supprimer des enregistrements dans le curseur affiché ?

①La sous-chaîne WHERE CURRENT OF dans l'instruction UPDATE ou DELETE gère spécifiquement les données les plus récentes extraites de la table où l'opération UPDATE ou DELETE doit être effectuée.

Pour utiliser cette méthode, vous devez utiliser la sous-chaîne FOR UPDATE lors de la déclaration du curseur. Lorsque la boîte de dialogue utilise la sous-chaîne FOR UPDATE pour ouvrir un curseur,

Toutes les lignes de données de l'ensemble de retour seront au niveau de la ligne (ROW-). LEVEL) mode exclusif Verrouillé, les autres objets ne peuvent interroger que ces lignes de données,

ne peuvent pas effectuer d'opérations UPDATE, DELETE ou SELECT...FOR UPDATE.

Dans les requêtes multi-tables, utilisez la clause OF pour verrouiller une table spécifique. Si la clause OF est ignorée, les lignes de données sélectionnées dans toutes les tables seront verrouillées.

Si ces lignes de données ont été verrouillées par d'autres sessions, alors dans des circonstances normales, ORACLE attendra que les lignes de données soient déverrouillées.

② Utiliser la mise à jour ou la suppression :

⑴ Déclarer la mise à jour ou la suppression du curseur d'affichage :

   Cursor 游标名IS  SELECT 语句   For Update [ Of  更新列列名];
   Cursor 游标名IS  SELECT 语句   For Delete [ Of  更新列列名];

⑵ Utiliser l'enregistrement actuel du curseur d'affichage pour mettre à jour ou supprimer :

   Update  表名   SET   更新语句  Where   Current  Of   游标名;
   Delete  From  表名   Where   Current  Of   游标名;

Exemple 1 : Mettre à jour l'enregistrement du curseur d'affichage

   /*conn scott/tiger*/
   Declare
     Cursor myCur is select job from emp for update;
       vjob empa.job%type;
       rsal empa.sal%type;
    Begin
       open myCur;
       loop
          fetch myCur into vjob;
          exit when myCur%notFound;
          case  (vjob)
             when 'ANALYST' then  rsal := 0.1;
            when  'CLERK' then  rsal := 0.2;
             when  'MANAGER' then  rsal := 0.3;
             else
               rsal := 0.5;
          end case;
        update emp set sal = sal + rsal where current of myCur;
       end loop;
    End;
    /

Exemple 2 : Supprimer l'affichage Enregistrement du curseur

    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor  Select   JOB  From  empa  For  Update;
      vSal   emp.Sal%TYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  vSal;
       Exit  When  MyCursor%NotFound;
       If   vSal < 800 Then
        Delete  From empa  Where  Cursor  Of   MyCursor;
       End  If;  
      End    Loop;
    End;/

Qu'est-ce qu'un curseur d'affichage avec des paramètres ?

1. Semblables aux procédures et aux fonctions, les paramètres peuvent être transmis au curseur et utilisés dans les requêtes.

Le paramètre définit uniquement le type de données, pas la taille (tous les paramètres formels dans Oracle définissent uniquement le type de données, pas la taille).

  与过程不同的是,游标只能接受传递的值,而不能返回值。

   可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。

  游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。

2、使用带参数的显示游标

  • 声明带参数的显示游标:

   CURSOR 游标名  [(parameter[,parameter],...)]    IS   Select语句;

参数形式:

1,参数名   数据类型  

2,参数名   数据类型  DEFAULT  默认值

   例子:

    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor(pSal  Number  Default   800)  Select   JOB  From  empa Where  SAL >  pSal ;
      varA  MyCursor%ROWTYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  varA;
       Exit  When  MyCursor%NotFound;
       DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||&#39;    &#39;||varA.empno||&#39;    &#39;||varA.ename||&#39;  &#39;||varA.sal); 
      End    Loop;
    End;/

推荐教程:《Oracle教程

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn