PL/SQLのカーソルタイプ
カーソルはoracleの結果セットであり、クエリーの結果を格納します.
PL/SQLにおけるカーソルの宣言
注意のポイント:カーソルはdeclareに宣言する必要があります.openを使用してカーソルを開き、fetchはカーソルのデータを取り、closeはカーソルを閉じます.
暗黙カーソル:主にDMLデータに対する操作暗黙カーソルの属性はあります:暗黙カーソルはselect intoを使用できません
カーソルの表示
PL/SQLには、SELECT INTOおよびDML文の処理に使用される隠しカーソルと表示カーソルの2種類のカーソルタイプがあります.表示カーソルは、SELECT文が返す複数行のデータに特化しています.
-------------------------------暗黙カーソルタイプ
--暗黙カーソルDML文を使用すると自動的に暗黙カーソルが作成されます--DML削除が追加され、データが変更された場合(データの変更に関連します)
%foundはデータを発見し、%notfoundはデータを発見していません、%isopenカーソルが開いているかどうか、%rowCountが影響を受けるローの数
例;更新データでカーソルを使用して暗黙カーソルをテストする
DMLデータを操作するとき、デフォルトでは暗黙カーソルsqlがあります.
結果;
影響を受けた1行のカーソルが開かれていません
--------------------------------------カーソル表示
カーソルを表示してデータを格納します.これもカーソルの主な機能です.
%rowtypeは%typeと似ています.%rowtypeはすべてのフィールドを格納します.%typeは1つのフィールドにしか一致しません.%rowtypeを使用してクエリー文から返されるデータを格納します.
%typehe%rowtypeの違い;
empテーブルのすべてのフィールドを宣言
%rowtype宣言empテーブルのすべてのフィールド
%rowtypeを使用してempテーブル部門10のデータを印刷
------------------------静的カーソルを表示
複数ローのデータを受け入れるには、カーソルを使用して受け入れる必要があります.
カーソルバンドパラメータのタイプ
Fetchがカーソルを取るデータforループとfetchがカーソルを取るには特に注意が必要である.
------------------------------------------カーソルの更新
部門20の名前などのフィールドを検索し、SMITHの給与を更新する
-------------------------------カーソルの削除
カーソル内の部門20のSMITHを削除する.テストのために、保存点a savepoint aを設定します.rollback to aへの返信が便利です.
-----------------------------動的カーソルref cursorを表示
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