PL/SQLのカーソルタイプ


カーソルはoracleの結果セットであり、クエリーの結果を格納します.
 
PL/SQLにおけるカーソルの宣言
1,    

2,    (      );

3,    

4,    

 
 
注意のポイント:カーソルはdeclareに宣言する必要があります.openを使用してカーソルを開き、fetchはカーソルのデータを取り、closeはカーソルを閉じます.
 
暗黙カーソル:主にDMLデータに対する操作暗黙カーソルの属性はあります:暗黙カーソルはselect intoを使用できません
%FOUND – SQL              TRUE
%NOTFOUND – SQL            TRUE
%ROWCOUNT – SQL        
%ISOPEN  -       ,   FALSE

 
 
カーソルの表示
PL/SQLには、SELECT INTOおよびDML文の処理に使用される隠しカーソルと表示カーソルの2種類のカーソルタイプがあります.表示カーソルは、SELECT文が返す複数行のデータに特化しています.
 
-------------------------------暗黙カーソルタイプ
--暗黙カーソルDML文を使用すると自動的に暗黙カーソルが作成されます--DML削除が追加され、データが変更された場合(データの変更に関連します)
%foundはデータを発見し、%notfoundはデータを発見していません、%isopenカーソルが開いているかどうか、%rowCountが影響を受けるローの数
例;更新データでカーソルを使用して暗黙カーソルをテストする
DMLデータを操作するとき、デフォルトでは暗黙カーソルsqlがあります.
declare--  pl/sql 
begin
 update emp set sal=3000 where ename='SMITH';--    

 if sql%found then --      
   dbms_output.put_line(' '||sql%rowcount||'     ');
else --  
   dbms_output.put_line('      ');
end if;

 if sql%isopen then  --      ,        
    dbms_output.put_line('     ');
else --      
dbms_output.put_line('       ');
end if;

end;
/

結果;
影響を受けた1行のカーソルが開かれていません
 
--------------------------------------カーソル表示
 
カーソルを表示してデータを格納します.これもカーソルの主な機能です.
%rowtypeは%typeと似ています.%rowtypeはすべてのフィールドを格納します.%typeは1つのフィールドにしか一致しません.%rowtypeを使用してクエリー文から返されるデータを格納します.
 
%typehe%rowtypeの違い;
empテーブルのすべてのフィールドを宣言
--%type  emp       
declare
type emp_type_record is record(
  v_ename    emp.ename%type;
  v_sal    emp.sal%type;
   v_empno emp.empno%type;
 ..........
);
begin
end

%rowtype宣言empテーブルのすべてのフィールド
  declare
v_rowtype emp%rowtype;
  begin
end;

 
%rowtypeを使用してempテーブル部門10のデータを印刷
declare
myrow emp%rowtype;
begin
      select ename,job,sal into myrow.ename,myrow.job,myrow.sal from emp where empno=10;
       dbms_output.put_line('ename:'||myrow.ename);
end;
 
ORA-01403:        
ORA-06512:   line 5

 
------------------------静的カーソルを表示
 
複数ローのデータを受け入れるには、カーソルを使用して受け入れる必要があります.
declare
myrow emp%rowtype;
  cursor rowcursor is select * from emp where deptno=&a;--    
begin
 --           
   for myrow in rowcursor loop
  dbms_output.put_line(myrow.ename||'+++++++++++'||myrow.sal);
  end loop;
end;
CLARK+++++++++++2450
KING+++++++++++5000
MILLER+++++++++++1300

 
カーソルバンドパラメータのタイプ
declare
myrow emp%rowtype;
  cursor rowcursor(v_deptno number) is select * from emp where deptno=v_deptno;--    
begin
 --           
   for myrow in rowcursor(10) loop
  dbms_output.put_line(myrow.ename||'+++++++++++'||myrow.sal);
  end loop;
end;
CLARK+++++++++++2450
KING+++++++++++5000
MILLER+++++++++++1300

 
Fetchがカーソルを取るデータforループとfetchがカーソルを取るには特に注意が必要である.
declare
 myrow emp%rowtype;
 cursor rowcorsor is select * from emp where deptno=&a;
begin
    --    
    open rowcorsor;
loop
    fetch rowcorsor into myrow;
   exit when rowcorsor%notfound;
dbms_output.put_line(myrow.ename||'+++++++'||myrow.sal);
   end loop;
end;
/
CLARK+++++++2450
KING+++++++5000
MILLER+++++++1300

 
 
 
------------------------------------------カーソルの更新
部門20の名前などのフィールドを検索し、SMITHの給与を更新する
declare
myrow emp%rowtype;
  cursor rowcursor(v_deptno number) is select * from emp where deptno=v_deptno;--    
begin
 --           
   for myrow in rowcursor(20) loop
  dbms_output.put_line('   :'||myrow.ename||'+++++++++++'||myrow.sal);
  end loop;
 
update emp set sal=3000 where ename='SMITH';

 for myrow in rowcursor(20) loop
dbms_output.put_line('   :'||myrow.ename||'+++++++++++'||myrow.sal);
end loop; 
end;
   :SMITH+++++++++++1000
   :JONES+++++++++++2975
   :SCOTT+++++++++++3000
   :ADAMS+++++++++++1100
   :FORD+++++++++++3000
   :SMITH+++++++++++3000
   :JONES+++++++++++2975
   :SCOTT+++++++++++3000
   :ADAMS+++++++++++1100
   :FORD+++++++++++3000

 
 
 
-------------------------------カーソルの削除
カーソル内の部門20のSMITHを削除する.テストのために、保存点a savepoint aを設定します.rollback to aへの返信が便利です.
 
declare
myrow emp%rowtype;
  cursor rowcursor(v_deptno number) is select * from emp where deptno=v_deptno;--    
begin
 --           
   for myrow in rowcursor(20) loop
  dbms_output.put_line('   :'||myrow.ename||'+++++++++++'||myrow.sal);
  end loop;
 
delete emp where ename='SMITH';

 for myrow in rowcursor(20) loop
dbms_output.put_line('   :'||myrow.ename||'+++++++++++'||myrow.sal);
end loop; 
end;
 

   :JONES+++++++++++2975
   :SCOTT+++++++++++3000
   :ADAMS+++++++++++1100
   :FORD+++++++++++3000
   :JONES+++++++++++2975
   :SCOTT+++++++++++3000
   :ADAMS+++++++++++1100
   :FORD+++++++++++3000

 
 
-----------------------------動的カーソルref cursorを表示
declare 
 type emp_type_cursor is ref cursor;
  mycursor emp_type_cursor;
 v_row emp%rowtype;
begin
   open mycursor for select * from emp where deptno=&a;
  loop

  fetch mycursor into v_row;
  exit when mycursor%notfound;
  dbms_output.put_line(v_row.ename);
end loop;
end;
 
SMITH
JONES
SCOTT
ADAMS
FORD