Maison >base de données >Oracle >qu'est-ce que le curseur Oracle
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.
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||' '||varA.empno||' '||varA.ename||' '||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!