Oracleの研究ノート(XVIII)PL / SQLカーソル

カーソル

説明

クエリはJavaで反復子に対応する、カーソルの結果は、トラバーサル操作を容易にします

プロパティを使用することができます

  • FOUND%の
    SQL文は、照会またはTRUEに1つ以上の行に影響を与えることにします。以下のような:MyCursorと%がFOUND
  • NOTFOUND%の
    SQLステートメントは、任意の行がTRUEに設定されている影響を与えませんでした。以下のような:MyCursorと%NOTFOUND
  • %のROWCOUNTの
    SQLステートメントまたはクエリによって影響を受けた行の数。以下のような:MyCursorと%ROWCOUNT
  • %ISOPEN
    カーソルが開いているかどうか、暗黙のカーソルは常にFALSEで確認してください。以下のような:MyCursorと%ISOPEN

暗黙カーソル

自動ステートメントが自動的に開き、自動的にシャットダウンSQL名は、
データのみの単一の行を処理することができます

declare
emp_t employee%rowtype;
begin
    select * into emp_t from employee where empno = 7859;   
    if SQL%found then
    dbms_output.putline()
    end if;
end;
/

明示カーソル

トラバーサル出力

cursor 游标名称[(参数列表)] IS select_statement;

--使用游标遍历查询结果并输出
declare
    --给查询结果建立一个游标
    cursor cv_emp is select * from employee;
    v_emp employee%rowtype;
begin
    --使用for循环,游标会自动打开,移动和关闭
    for v_emp in cv_emp loop
        --这里只输出了员工编号和员工姓名
        dbms_output.put_line(v_emp.empno||','||v_emp.ename);
    end loop;
end;
/

カーソルを使用

  1. カーソルを宣言します。カーソルカーソル名[(パラメータリスト)] select_statementにされます。
  2. オープンカーソル:オープンカーソル名[(パラメータリスト)];
  3. 変数にカーソル(カーソル移動)からデータを抽出する:...変数名リストにカーソルをFETCH。
  4. カーソルをクローズします:閉じるカーソル名。

カーソルが最初の行にあるときに開始する前に、我々は移動する必要があります

--loop循环使用显示游标
--输出全部员工的信息
declare
    cursor cv_emp 
     is select empno,ename,job,sal,hiredate from employee;
    --声明一个可存储游标行的变量
    rec_emp cv_emp%rowtype;
    i number := 1;
begin
    open cv_emp;
    loop
        --会使游标向下移动,并将游标所指向的数提取到指定的变量中
        fetch cv_emp into rec_emp;
        exit when cv_emp%notfound;--找不到数据就退出循环
        dbms_output.put_line(i||'. '||rec_emp.empno||', '
                           ||rec_emp.ename||', '
                           ||rec_emp.job||','
                           ||rec_emp.sal||','
                           ||rec_emp.hiredate);
        i := i+1;
    end loop;
    close cv_emp;--关闭游标
end;
/

--使用while循环
declare
   --1. 声明游标
   cursor cv_emp 
     is select empno,ename,job,sal,hiredate from employee;
     
   rec_emp cv_emp%rowtype;
   i number := 1;
begin
    open cv_emp;--2.打开游标
    fetch cv_emp into rec_emp;--进入循环前就得移动游标
    while cv_emp%found loop
        dbms_output.put_line(i||'. '||rec_emp.empno||', '
                           ||rec_emp.ename||', '
                           ||rec_emp.job||','
                           ||rec_emp.sal||','
                           ||rec_emp.hiredate);
         fetch cv_emp into rec_emp;
         i := i+1;
    end loop;
    close cv_emp;--关闭游标
end;
/

カーソルを使用してパラメータ

--对所有的"销售员"(SALESMAN)增加佣金500.
declare
    cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job;
    v_emp employee%rowtype;
begin
    for v_emp in cv_emp('SALESMAN') loop
        --使用主键约束,更新特定行
        update employee set sal = sal +500 where empno = v_emp.empno;
    end loop;
commit; 
end;
/

カーソルの更新データ

一般的な更新操作は、条件は、一般的に主キーを指定するために使用されたデータの一部を指定するために更新する必要があります。
あなたは主キーを指定しない場合、あなたはまた、指定した条件として、カーソルを使用することができ、これはカーソル更新の行であります

--对所有的"销售员"(SALESMAN)增加佣金500.

--普通方式更新数据
declare
    cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job;
    v_emp employee%rowtype;
begin
    for v_emp in cv_emp('SALESMAN') loop
        --使用主键约束,更新特定行
        update employee set sal = sal +500 where empno = v_emp.empno;
    end loop;
commit; 
end;
/

--使用游标更新数据
declare
    cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job for update;
    v_emp employee%rowtype;
begin
    open cv_emp('SALESMAN');
    loop
        fetch cv_emp into v_emp;
        --使用游标定位特定行
        update employee set sal = sal +500 where current of cv_emp;
        end if;
        exit when ev_emp%notfound;
    end loop;
    commit; 
    close cv_emp;
end;
/

REFカーソル

後で補足REFカーソル、アニメーションカーソル..

おすすめ

転載: www.cnblogs.com/kexing/p/10943878.html