日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle学习笔记(十八) PL/SQL 游标

發(fā)布時(shí)間:2025/3/15 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle学习笔记(十八) PL/SQL 游标 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

游標(biāo)

說明

查詢結(jié)果的光標(biāo),相當(dāng)于java中的一個(gè)迭代器,方便遍歷操作

可使用的屬性

  • %FOUND
    SQL語句查詢或影響了一行或多行時(shí)為 TRUE。如:mycursor%FOUND
  • %NOTFOUND
    SQL語句沒有影響任何行時(shí)為 TRUE。如:mycursor%NOTFOUND
  • %ROWCOUNT
    SQL語句查詢或影響的行數(shù)。如:mycursor%ROWCOUNT
  • %ISOPEN
    檢查游標(biāo)是否打開,隱式游標(biāo)始終為FALSE。如:mycursor%ISOPEN

隱式游標(biāo)

自動(dòng)聲明,自動(dòng)打開,自動(dòng)關(guān)閉,名稱為SQL
只能處理單行數(shù)據(jù)

declare emp_t employee%rowtype; beginselect * into emp_t from employee where empno = 7859; if SQL%found thendbms_output.putline()end if; end; /

顯式游標(biāo)

遍歷輸出

cursor 游標(biāo)名稱[(參數(shù)列表)] IS select_statement;--使用游標(biāo)遍歷查詢結(jié)果并輸出 declare--給查詢結(jié)果建立一個(gè)游標(biāo)cursor cv_emp is select * from employee;v_emp employee%rowtype; begin--使用for循環(huán),游標(biāo)會(huì)自動(dòng)打開,移動(dòng)和關(guān)閉for v_emp in cv_emp loop--這里只輸出了員工編號(hào)和員工姓名dbms_output.put_line(v_emp.empno||','||v_emp.ename);end loop; end; /

游標(biāo)使用

  • 聲明游標(biāo): cursor 游標(biāo)名稱[(參數(shù)列表)] IS select_statement;
  • 打開游標(biāo): open 游標(biāo)名稱[(參數(shù)列表)];
  • 從游標(biāo)中提取數(shù)據(jù)(移動(dòng)游標(biāo))到變量: FETCH 游標(biāo)名稱 INTO 變量列表....;
  • 關(guān)閉游標(biāo): close 游標(biāo)名稱;
  • 游標(biāo)開始的時(shí)候是處于第一行之前,需要移動(dòng)

    --loop循環(huán)使用顯示游標(biāo) --輸出全部員工的信息 declarecursor cv_emp is select empno,ename,job,sal,hiredate from employee;--聲明一個(gè)可存儲(chǔ)游標(biāo)行的變量rec_emp cv_emp%rowtype;i number := 1; beginopen cv_emp;loop--會(huì)使游標(biāo)向下移動(dòng),并將游標(biāo)所指向的數(shù)提取到指定的變量中fetch cv_emp into rec_emp;exit when cv_emp%notfound;--找不到數(shù)據(jù)就退出循環(huán)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;--關(guān)閉游標(biāo) end; /--使用while循環(huán) declare--1. 聲明游標(biāo)cursor cv_emp is select empno,ename,job,sal,hiredate from employee;rec_emp cv_emp%rowtype;i number := 1; beginopen cv_emp;--2.打開游標(biāo)fetch cv_emp into rec_emp;--進(jìn)入循環(huán)前就得移動(dòng)游標(biāo)while cv_emp%found loopdbms_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;--關(guān)閉游標(biāo) end; /

    帶參數(shù)游標(biāo)使用

    --對(duì)所有的"銷售員"(SALESMAN)增加傭金500. declarecursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job;v_emp employee%rowtype; beginfor v_emp in cv_emp('SALESMAN') loop--使用主鍵約束,更新特定行update employee set sal = sal +500 where empno = v_emp.empno;end loop; commit; end; /

    游標(biāo)更新數(shù)據(jù)

    一般更新操作,需要一個(gè)條件,來指定需要更新的該條數(shù)據(jù),一般使用主鍵來指定。
    如果不想使用主鍵來指定,還可以使用游標(biāo)當(dāng)作指定條件,這就是游標(biāo)更新行

    --對(duì)所有的"銷售員"(SALESMAN)增加傭金500.--普通方式更新數(shù)據(jù) declarecursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job;v_emp employee%rowtype; beginfor v_emp in cv_emp('SALESMAN') loop--使用主鍵約束,更新特定行update employee set sal = sal +500 where empno = v_emp.empno;end loop; commit; end; /--使用游標(biāo)更新數(shù)據(jù) declarecursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job for update;v_emp employee%rowtype; beginopen cv_emp('SALESMAN');loopfetch cv_emp into v_emp;--使用游標(biāo)定位特定行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游標(biāo)

    引用游標(biāo),動(dòng)態(tài)游標(biāo)
    動(dòng)態(tài)游標(biāo)

    轉(zhuǎn)載于:https://www.cnblogs.com/kexing/p/10943878.html

    總結(jié)

    以上是生活随笔為你收集整理的oracle学习笔记(十八) PL/SQL 游标的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。