亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Oracle 游標使用全解

系統 2159 0

-- 聲明游標;CURSOR cursor_name IS select_statement

--For 循環游標 --(1)定義游標 --(2)定義游標變量 --(3)使用for循環來使用這個游標 declare ?????? --類型定義 ?????? cursor c_job ?????? is ?????? select empno,ename,job,sal ?????? from emp ?????? where job='MANAGER'; ?????? --定義一個游標變量v_cinfo c_emp%ROWTYPE ,該類型為游標c_emp中的一行數據類型 ?????? c_row c_job%rowtype; begin ?????? for c_row in c_job loop ???????? dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal); ?????? end loop; end;

????? --Fetch游標 --使用的時候必須要明確的打開和關閉

declare ?????? --類型定義 ?????? cursor c_job ?????? is ?????? select empno,ename,job,sal ?????? from emp ?????? where job='MANAGER'; ?????? --定義一個游標變量 ?????? c_row c_job%rowtype; begin ?????? open c_job; ???????? loop ?????????? --提取一行數據到c_row ?????????? fetch c_job into c_row; ?????????? --判讀是否提取到值,沒取到值就退出 ?????????? --取到值c_job%notfound 是false ?????????? --取不到值c_job%notfound 是true ?????????? exit when c_job%notfound; ??????????? dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal); ???????? end loop; ?????? --關閉游標 ????? close c_job; end;

--1:任意執行一個update操作,用隱式游標sql的屬性%found,%notfound,%rowcount,%isopen觀察update語句的執行情況。 ?????? begin ???????? update emp set ENAME='ALEARK' WHERE EMPNO=7469; ???????? if sql%isopen then ?????????? dbms_output.put_line('Openging'); ?????????? else ???????????? dbms_output.put_line('closing'); ???????????? end if; ????????? if sql%found then ??????????? dbms_output.put_line('游標指向了有效行');--判斷游標是否指向有效行 ??????????? else ????????????? dbms_output.put_line('Sorry'); ????????????? end if; ????????????? if sql%notfound then ??????????????? dbms_output.put_line('Also Sorry'); ??????????????? else ????????????????? dbms_output.put_line('Haha'); ????????????????? end if; ?????????????????? dbms_output.put_line(sql%rowcount); ?????????????????? exception ???????????????????? when no_data_found then ?????????????????????? dbms_output.put_line('Sorry No data'); ?????????????????????? when too_many_rows then ???????????????????????? dbms_output.put_line('Too Many rows'); ???????????????????????? end; declare ?????? empNumber emp.EMPNO%TYPE; ?????? empName emp.ENAME%TYPE; ?????? begin ???????? if sql%isopen then ?????????? dbms_output.put_line('Cursor is opinging'); ?????????? else ???????????? dbms_output.put_line('Cursor is Close'); ???????????? end if; ???????????? if sql%notfound then ?????????????? dbms_output.put_line('No Value'); ?????????????? else ???????????????? dbms_output.put_line(empNumber); ???????????????? end if; ???????????????? dbms_output.put_line(sql%rowcount); ???????????????? dbms_output.put_line('-------------'); ???????????????? ???????????????? select EMPNO,ENAME into? empNumber,empName from emp where EMPNO=7499; ???????????????? dbms_output.put_line(sql%rowcount); ???????????????? ??????????????? if sql%isopen then ??????????????? dbms_output.put_line('Cursor is opinging'); ??????????????? else ??????????????? dbms_output.put_line('Cursor is Closing'); ??????????????? end if; ???????????????? if sql%notfound then ???????????????? dbms_output.put_line('No Value'); ???????????????? else ???????????????? dbms_output.put_line(empNumber); ???????????????? end if; ???????????????? exception ?????????????????? when no_data_found then ???????????????????? dbms_output.put_line('No Value'); ???????????????????? when too_many_rows then ?????????????????????? dbms_output.put_line('too many rows'); ?????????????????????? end; ?????????????????? ???????????????? ?????? --2,使用游標和loop循環來顯示所有部門的名稱 --游標聲明 declare ?????? cursor csr_dept ?????? is ?????? --select語句 ?????? select DNAME ?????? from Depth; ?????? --指定行指針,這句話應該是指定和csr_dept行類型相同的變量 ?????? row_dept csr_dept%rowtype; begin ?????? --for循環 ?????? for row_dept in csr_dept loop ?????????? dbms_output.put_line('部門名稱:'||row_dept.DNAME); ?????? end loop; end;

--3,使用游標和while循環來顯示所有部門的的地理位置(用%found屬性) declare ?????? --游標聲明 ?????? cursor csr_TestWhile ?????? is ?????? --select語句 ?????? select? LOC ?????? from Depth; ?????? --指定行指針 ?????? row_loc csr_TestWhile%rowtype; begin ? --打開游標 ?????? open csr_TestWhile; ?????? --給第一行喂數據 ?????? fetch csr_TestWhile into row_loc; ?????? --測試是否有數據,并執行循環 ???????? while csr_TestWhile%found loop ?????????? dbms_output.put_line('部門地點:'||row_loc.LOC); ?????????? --給下一行喂數據 ?????????? fetch csr_TestWhile into row_loc; ???????? end loop; ?????? close csr_TestWhile; end; select * from emp

?

?????? --4,接收用戶輸入的部門編號,用for循環和游標,打印出此部門的所有雇員的所有信息(使用循環游標) --CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement; --定義參數的語法如下:Parameter_name [IN] data_type[{:=|DEFAULT} value]?

declare ????? CURSOR ????? c_dept(p_deptNo number) ????? is ????? select * from emp where emp.depno=p_deptNo; ????? r_emp emp%rowtype; begin ??????? for r_emp in c_dept(20) loop ??????????? dbms_output.put_line('員工號:'||r_emp.EMPNO||'員工名:'||r_emp.ENAME||'工資:'||r_emp.SAL); ??????? end loop; end; select * from emp?? --5:向游標傳遞一個工種,顯示此工種的所有雇員的所有信息(使用參數游標) declare ?????? cursor ?????? c_job(p_job nvarchar2) ?????? is ?????? select * from emp where JOB=p_job; ?????? r_job emp%rowtype; begin ?????? for r_job in c_job('CLERK') loop ?????????? dbms_output.put_line('員工號'||r_job.EMPNO||' '||'員工姓名'||r_job.ENAME); ??????? end loop; end; SELECT * FROM EMP

--6:用更新游標來為雇員加傭金:(用if實現,創建一個與emp表一摸一樣的emp1表,對emp1表進行修改操作),并將更新前后的數據輸出出來 --http://zheng12tian.iteye.com/blog/815770 ??????? create table emp1 as select * from emp; ??????? declare ??????? cursor ??????? csr_Update ??????? is ??????? select * from? emp1 for update OF SAL; ??????? empInfo csr_Update%rowtype; ??????? saleInfo? emp1.SAL%TYPE; begin ??? FOR empInfo IN csr_Update LOOP ????? IF empInfo.SAL<1500 THEN ??????? saleInfo:=empInfo.SAL*1.2; ?????? elsif empInfo.SAL<2000 THEN ??????? saleInfo:=empInfo.SAL*1.5; ??????? elsif empInfo.SAL<3000 THEN ??????? saleInfo:=empInfo.SAL*2; ????? END IF; ????? UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_Update; ???? END LOOP; END;

--7:編寫一個PL/SQL程序塊,對名字以‘A’或‘S’開始的所有雇員按他們的基本薪水(sal)的10%給他們加薪(對emp1表進行修改操作) declare ???? cursor ????? csr_AddSal ???? is ????? select * from emp1 where ENAME LIKE 'A%' OR ENAME LIKE 'S%' for update OF SAL; ????? r_AddSal csr_AddSal%rowtype; ????? saleInfo? emp1.SAL%TYPE; begin ????? for r_AddSal in csr_AddSal loop ????????? dbms_output.put_line(r_AddSal.ENAME||'原來的工資:'||r_AddSal.SAL); ????????? saleInfo:=r_AddSal.SAL*1.1; ????????? UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_AddSal; ????? end loop; end; --8:編寫一個PL/SQL程序塊,對所有的salesman增加傭金(comm)500 declare ????? cursor ????????? csr_AddComm(p_job nvarchar2) ????? is ????????? select * from emp1 where?? JOB=p_job FOR UPDATE OF COMM; ????? r_AddComm? emp1%rowtype; ????? commInfo emp1.comm%type; begin ??? for r_AddComm in csr_AddComm('SALESMAN') LOOP ??????? commInfo:=r_AddComm.COMM+500; ???????? UPDATE EMP1 SET COMM=commInfo where CURRENT OF csr_AddComm; ??? END LOOP; END;

--9:編寫一個PL/SQL程序塊,以提升2個資格最老的職員為MANAGER(工作時間越長,資格越老) --(提示:可以定義一個變量作為計數器控制游標只提取兩條數據;也可以在聲明游標的時候把雇員中資格最老的兩個人查出來放到游標中。) declare ??? cursor crs_testComput ??? is ??? select * from emp1 order by HIREDATE asc; ??? --計數器 ??? top_two number:=2; ??? r_testComput crs_testComput%rowtype; begin ??? open crs_testComput; ?????? FETCH crs_testComput INTO r_testComput; ????????? while top_two>0 loop ???????????? dbms_output.put_line('員工姓名:'||r_testComput.ENAME||' 工作時間:'||r_testComput.HIREDATE); ???????????? --計速器減一 ???????????? top_two:=top_two-1; ???????????? FETCH crs_testComput INTO r_testComput; ?????????? end loop; ???? close crs_testComput; end; ???

--10:編寫一個PL/SQL程序塊,對所有雇員按他們的基本薪水(sal)的20%為他們加薪, --如果增加的薪水大于300就取消加薪(對emp1表進行修改操作,并將更新前后的數據輸出出來) declare ??? cursor ??????? crs_UpadateSal ??? is ??????? select * from emp1 for update of SAL; ??????? r_UpdateSal crs_UpadateSal%rowtype; ??????? salAdd emp1.sal%type; ??????? salInfo emp1.sal%type; begin ??????? for r_UpdateSal in crs_UpadateSal loop ?????????? salAdd:= r_UpdateSal.SAL*0.2; ?????????? if salAdd>300 then ???????????? salInfo:=r_UpdateSal.SAL; ????????????? dbms_output.put_line(r_UpdateSal.ENAME||':? 加薪失敗。'||'薪水維持在:'||r_UpdateSal.SAL); ???????????? else ????????????? salInfo:=r_UpdateSal.SAL+salAdd; ????????????? dbms_output.put_line(r_UpdateSal.ENAME||':? 加薪成功.'||'薪水變為:'||salInfo); ?????????? end if; ?????????? update emp1 set SAL=salInfo where current of crs_UpadateSal; ??????? end loop; end; ???? --11:將每位員工工作了多少年零多少月零多少天輸出出來?? --近似 ? --CEIL(n)函數:取大于等于數值n的最小整數 ? --FLOOR(n)函數:取小于等于數值n的最大整數 ? --truc的用法 http://publish.it168.com/2005/1028/20051028034101.shtml declare ? cursor ?? crs_WorkDay ?? is ?? select ENAME,HIREDATE, trunc(months_between(sysdate, hiredate) / 12) AS SPANDYEARS, ?????? trunc(mod(months_between(sysdate, hiredate), 12)) AS months, ?????? trunc(mod(mod(sysdate - hiredate, 365), 12)) as days ?? from emp1; ? r_WorkDay crs_WorkDay%rowtype; begin ??? for?? r_WorkDay in crs_WorkDay loop ??? dbms_output.put_line(r_WorkDay.ENAME||'已經工作了'||r_WorkDay.SPANDYEARS||'年,零'||r_WorkDay.months||'月,零'||r_WorkDay.days||'天'); ??? end loop; end; ? --12:輸入部門編號,按照下列加薪比例執行(用CASE實現,創建一個emp1表,修改emp1表的數據),并將更新前后的數據輸出出來 --? deptno? raise(%) --? 10????? 5% --? 20????? 10% --? 30????? 15% --? 40????? 20% --? 加薪比例以現有的sal為標準 --CASE expr WHEN comparison_expr THEN return_expr --[, WHEN comparison_expr THEN return_expr]... [ELSE else_expr] END declare ???? cursor ???????? crs_caseTest ????????? is ????????? select * from emp1 for update of SAL; ????????? r_caseTest crs_caseTest%rowtype; ????????? salInfo emp1.sal%type; ???? begin ???????? for r_caseTest in crs_caseTest loop ???????? case ?????????? when r_caseTest.DEPNO=10 ?????????? THEN salInfo:=r_caseTest.SAL*1.05; ?????????? when r_caseTest.DEPNO=20 ?????????? THEN salInfo:=r_caseTest.SAL*1.1; ?????????? when r_caseTest.DEPNO=30 ?????????? THEN salInfo:=r_caseTest.SAL*1.15; ??????????? when r_caseTest.DEPNO=40 ?????????? THEN salInfo:=r_caseTest.SAL*1.2; ???????? end case; ????????? update emp1 set SAL=salInfo where current of crs_caseTest; ??????? end loop; end;

--13:對每位員工的薪水進行判斷,如果該員工薪水高于其所在部門的平均薪水,則將其薪水減50元,輸出更新前后的薪水,員工姓名,所在部門編號。 --AVG([distinct|all] expr) over (analytic_clause) ---作用: --按照analytic_clause中的規則求分組平均值。 ? --分析函數語法: ? --FUNCTION_NAME(<argument>,<argument>...) ? --OVER ? --(<Partition-Clause><Order-by-Clause><Windowing Clause>) ???? --PARTITION子句 ???? --按照表達式分區(就是分組),如果省略了分區子句,則全部的結果集被看作是一個單一的組 ???? select * from emp1 DECLARE ???? CURSOR ???? crs_testAvg ???? IS ???? select EMPNO,ENAME,JOB,SAL,DEPNO,AVG(SAL) OVER (PARTITION BY DEPNO ) AS DEP_AVG ???? FROM EMP1 for update of SAL; ???? r_testAvg crs_testAvg%rowtype; ???? salInfo emp1.sal%type; ???? begin ???? for r_testAvg in crs_testAvg loop ???? if r_testAvg.SAL>r_testAvg.DEP_AVG then ???? salInfo:=r_testAvg.SAL-50; ???? end if; ???? update emp1 set SAL=salInfo where current of crs_testAvg; ???? end loop; end;

Oracle 游標使用全解


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 操操操网站 | 免费一看一级毛片全播放 | 99亚洲精品视频 | 精品国产91乱码一区二区三区 | 久久亚洲热 | 色鬼久久爱综合久久鬼色 | 夜色精品国产一区二区 | 亚洲一区二区三区在线免费观看 | 国产成人亚洲精品乱码在线观看 | 伊人网2021| 毛片5| 一级毛片日韩a欧美视频 | 亚洲国产成人精品一区二区三区 | 国产婷婷丁香久久综合 | 亚洲福利视频一区二区三区 | 五月婷婷激情综合 | 日本一区色 | 亚洲高清综合 | 我要看一级毛片 | 午夜影网 | 在线精品国内视频秒播 | 男女羞羞网站 | 成人禁在线观看午夜亚洲 | 精品亚洲国产国拍 | 欧美在线观看一区二区 | 国产成人在线免费观看 | 亚洲综合成人在线 | 一级毛片美国一级j毛片不卡 | 91视频毛片| 欧美人与鲁交大毛片免费 | 国产精品成人免费观看 | 欧美成人天天综合在线视色 | 免费观看欧美精品成人毛片 | 一区二区高清视频 | 亚洲成人av| 精品国产日韩亚洲一区91 | 桃花福利视频在线观看 | 美女视频很黄很黄又免费的 | 一级女性全黄生活片免费看 | 成人黄色在线免费观看 | 伊人二区|