<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java,J2EE,Weblogic,Oracle

    java項(xiàng)目隨筆
    隨筆 - 90, 文章 - 6, 評(píng)論 - 61, 引用 - 0
    數(shù)據(jù)加載中……

    Oracle學(xué)習(xí)筆記(5) 在PLSQL中使用游標(biāo)獲取數(shù)據(jù)

    這是第五章的學(xué)習(xí)筆記,學(xué)習(xí)完第四章的數(shù)據(jù)庫(kù)操作和事務(wù)之后,開(kāi)始要學(xué)習(xí)游標(biāo)的使用了……,希望大家能多給俺一些支持啊!
        編程時(shí)使用的工具是PLSQL Developer 7.1.4

    隱式游標(biāo)
    隱式游標(biāo)的屬性等在第四章筆記中已記錄了一部分
    如果要確保屬性指向想要的SQL語(yǔ)句,那么就在SQL語(yǔ)句執(zhí)行后,立即將屬性值保存到一個(gè)本地變量中
    用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)這種效果:
    先定義一個(gè)存儲(chǔ)過(guò)程remove_from_emp ,用于從雇員中刪除一個(gè)員工
    在存儲(chǔ)過(guò)程的參數(shù)中 in 表示輸入,out 表示輸出
    Sql代碼 復(fù)制代碼
    1. create or replace procedure remove_from_emp(empno_in in employee.empno%type)   
    2. is  
    3. begin  
    4.    delete from employee where empno = empno_in;   
    5.    dbms_output.put_line('刪除了' || sql%rowcount || '條記錄!');   
    6. end;   
    7. /   
    8. -- 定義一個(gè)存儲(chǔ)過(guò)程來(lái)調(diào)用存儲(chǔ)過(guò)程remove_from_emp,并保存隱式游標(biāo)的屬性值   
    9. create or replace procedure show_emp_count is  
    10.    i_count integer;   
    11.    i_numfound pls_integer;   
    12. begin  
    13.    select count(*) into i_count from employee;   
    14.    -- 將屬性值做一個(gè)快照   
    15.    i_numfound := sql%rowcount;   
    16.    -- 注意employee表中沒(méi)有編號(hào)為99的員工   
    17.    -- 調(diào)用存儲(chǔ)過(guò)程remove_from_emp   
    18.    remove_from_emp(1);   
    19.    -- 現(xiàn)在可以用前一條語(yǔ)句的屬性值輸出   
    20.    dbms_output.put_line(i_numfound);   
    21. end;   
    22. /  

    顯式游標(biāo)(PL/SQL塊中使用顯示游標(biāo)的本個(gè)步驟:聲明、打開(kāi)、提取記錄、關(guān)閉)
    在程序包規(guī)范中聲明一個(gè)游標(biāo)類型(我們可以在PL/SQL塊或者包的定義部分聲明游標(biāo)類型)
    Sql代碼 復(fù)制代碼
    1. create or replace package types   
    2. is  
    3. type emp_cur5 is ref cursor;   
    4. end;   
    5. /   
    6. declare  
    7.    -- 定義一個(gè)不帶參數(shù)的游標(biāo)emp_cur1,游標(biāo)的結(jié)果是employee表中員工的集合   
    8.    cursor emp_cur1 is select * from employee;   
    9.    -- 定義一個(gè)帶參數(shù)的游標(biāo)emp_cur2,游標(biāo)的結(jié)果集是匹配由游標(biāo)傳遞過(guò)來(lái)的員工編號(hào)的員工姓名和加入公司的時(shí)間   
    10.    cursor emp_cur2 (empno_in in number) is select name,hiredate from employee where empno = empno_in;   
    11.    -- 定義一個(gè)帶有return 子句的游標(biāo),游標(biāo)的結(jié)果集是員工編號(hào)為1的employee表中所有的列   
    12.    cursor emp_cur3 return employee%rowtype is select * from employee where empno = 1;   

    如果想通過(guò)游標(biāo)更新數(shù)據(jù),必須在select 語(yǔ)句后加上for update 子句,
    該select 語(yǔ)句涉及的所有行都會(huì)被鎖住
    如果是加上了for update of 列名,那么只有在for update 子句中引用了某個(gè)表的列時(shí),
    該表中的行才會(huì)被鎖住,of 列表并不限制只能更改列給出的列,它只讓我們知道要更改什么
    可以在for update 子句后添加一個(gè)nowait 關(guān)鍵字,用于告訴Oracle如果表已經(jīng)被其他用戶
    鎖住,就不需要等待了,這樣控制權(quán)會(huì)立即返回給我們的程序,如果沒(méi)有nowait子句進(jìn)程就
    會(huì)阻塞,直到表可用(commit或rollback)為止
    可以在Select into、Fetch into、Returning into子句中使用Bulk Collect將數(shù)據(jù)輸出到集合中
    Sql代碼 復(fù)制代碼
    1.    cursor emp_cur4 (empno_in in number) is select name,salary from employee where empno = empno_in for update;   
    2.    -- 應(yīng)該總是將游標(biāo)行提取到用%rowtype定義的記錄中,這樣更靈活(表字段改變了不需要更改fetch語(yǔ)句)   
    3.    emp_row1 employee%rowtype;   
    4.    -- 基于游標(biāo)定義一個(gè)記錄   
    5.    emp_row2 emp_cur2%rowtype;   
    6.    emp_row3 emp_cur3%rowtype;   
    7.    emp_row4 emp_cur4%rowtype;   
    8.    n_salary number(10,2);   
    9.    n_empno employee.empno%type := &員工編號(hào):;   
    10.       
    11.    -- 游標(biāo)變量和ref cursor   
    12.    -- 定義ref cursor 類型的游標(biāo)變量   
    13.    -- 創(chuàng)建一個(gè)強(qiáng)類型的引用游標(biāo)類型   
    14.    type emp_ref_type1 is ref cursor return employee%rowtype;   
    15.    -- 創(chuàng)建一個(gè)弱類型的引用游標(biāo)類型(弱類型的游標(biāo)變量比強(qiáng)類型的游標(biāo)變量更靈活)   
    16.    type emp_ref_type2 is ref cursor;   
    17.    -- 定義實(shí)際的游標(biāo)變量   
    18.    emp_ref1 emp_ref_type1;   
    19.    emp_ref2 emp_ref_type2;   
    20.    -- 從Oracle9i 開(kāi)始提供了一個(gè)名為sys_refcursor的預(yù)定義的Oracle系統(tǒng)游標(biāo),   
    21.    -- 它相當(dāng)于弱類型游標(biāo),使用它不需要定義游標(biāo)變量   
    22.    sys_cursor sys_refcursor;   
    23.    -- 定義一個(gè)行類型的集合   
    24.    type emp_table_type is table of employee%rowtype index by binary_integer;   
    25.    emp_table emp_table_type;   
    26.    type emp_info_type is record(name employee.name%type,job employee.job%type);   
    27.    emp_info emp_info_type;   
    28. begin  

    打開(kāi)游標(biāo):open 顯式游標(biāo)名 (參數(shù)列表)
    一旦打開(kāi)了顯式游標(biāo),就可以從游標(biāo)中提取記錄,直到?jīng)]有記錄留在游標(biāo)中
    打開(kāi)游標(biāo)時(shí),PL/SQL就開(kāi)始執(zhí)行該游標(biāo)的Select 查詢,但是實(shí)際上并不返回任何行,
    返回行的任務(wù)是由后面的Fetch(讀取)…… into(賦值給)……  語(yǔ)句完成的:
    fetch 游標(biāo)名 into 記錄或變量列表
    Sql代碼 復(fù)制代碼
    1. open emp_cur1;   
    2. -- 提取記錄   
    3. -- 如果游標(biāo)只返回一行可以用if、loop或for來(lái)判斷獲得數(shù)據(jù),如果游標(biāo)返回多行可以用loop或for來(lái)循環(huán)獲得數(shù)據(jù)   
    4. loop   
    5.    fetch emp_cur1 into emp_row1;   
    6.    exit when emp_cur1%notfound;   
    7.    dbms_output.put_line('員工' || emp_row1.name || '的工資是:' || emp_row1.salary);   
    8. end loop;   
    9. -- 關(guān)閉游標(biāo)并釋放資源   
    10. close emp_cur1;   
    11. -- 打開(kāi)帶參數(shù)的游標(biāo)   
    12. -- 游標(biāo)for 循環(huán)能很好的簡(jiǎn)化游標(biāo)的開(kāi)發(fā),我們不再需要聲明記錄,不再需要Open、Fetch和Close語(yǔ)句   
    13. -- 也不再需要%found屬性檢測(cè)記錄,一切Oracle隱式的幫我們完成了   
    14. for emp_row2 in emp_cur2(n_empno) loop   
    15.    dbms_output.put_line('員工' || emp_row2.name || '加入公司的時(shí)間是 ' || emp_row2.hiredate);   
    16. end loop;   
    17. -- 打開(kāi)帶return 子句的游標(biāo)   
    18. open emp_cur3;   
    19. fetch emp_cur3 into emp_row3;   
    20. if emp_cur3%found then  
    21.    dbms_output.put_line('員工' || emp_row3.name || '其職位是' || emp_row3.job || ',加入公司的時(shí)間是 ' || emp_row3.hiredate);   
    22. end if;   
    23. close emp_cur3;   
    24. -- 打開(kāi)帶for update 子句的游標(biāo),將指定編號(hào)的員工工資增加500元   
    25. open emp_cur4(n_empno);   
    26. fetch emp_cur4 into emp_row4;  

    where current of 游標(biāo)名 子句能很容易的修改最近提取的數(shù)據(jù)行(也就是當(dāng)前游標(biāo)指向的位置),
    這樣的好處是,如果表表結(jié)構(gòu)發(fā)生了改變,我們只需要更改Select語(yǔ)句的Where子句即可,而不
    需要更新每個(gè)SQL語(yǔ)句
    Sql代碼 復(fù)制代碼
    1.    if emp_cur4%found then  
    2.       update employee set salary = salary + 500 where current of emp_cur4; --returning salary into n_salary;   
    3.    end if;   
    4.    commit;   
    5.    n_salary := emp_row4.salary + 500;   
    6.    dbms_output.put_line('員工' || emp_row4.name || '原來(lái)的工資是' || emp_row4.salary || '元,增加工資后現(xiàn)在的工資是' || n_salary || '元');   
    7.    close emp_cur4;   
    8.       
    9.    -- 打開(kāi)強(qiáng)類型游標(biāo)變量   
    10.    open emp_ref1 for select * from employee order by salary;   
    11.    -- 在游標(biāo)變量中提取數(shù)據(jù)   
    12.    fetch emp_ref1 bulk collect into emp_table;   
    13.    for i in 1..emp_table.count loop   
    14.        dbms_output.put_line(emp_table(i).name || '   本月工資 ' || emp_table(i).salary);   
    15.    end loop;   
    16.    -- 關(guān)閉游標(biāo)變量   
    17.    close emp_ref1;   
    18.    -- 打開(kāi)弱類型游標(biāo)變量   
    19.    open emp_ref2 for select name,job from employee;   
    20.    loop   
    21.       fetch emp_ref2 into emp_info;   
    22.       exit when emp_ref2%notfound;   
    23.       dbms_output.put_line(emp_info.name || '的工作是 ' || emp_info.job);    
    24.    end loop;   
    25.    close emp_ref2;   
    26.    -- 打開(kāi)Oracle系統(tǒng)游標(biāo)   
    27.    open sys_cursor for select name,hiredate from employee order by hiredate desc;   
    28.    loop   
    29.       fetch sys_cursor into emp_info;   
    30.       exit when sys_cursor%notfound;   
    31.       dbms_output.put_line(emp_info.name || '加入公司的時(shí)間是 ' || emp_info.job);    
    32.    end loop;   
    33.    close sys_cursor;   
    34. exception   
    35.    when NO_DATA_FOUND then dbms_output.put_line('查詢不到員工編號(hào)為' || n_empno || '的員工!');   
    36.    when TOO_MANY_ROWS then dbms_output.put_line('數(shù)據(jù)完整性錯(cuò)誤,員工編號(hào)' || n_empno || '重復(fù)!');   
    37.    when OTHERS then dbms_output.put_line('PL/SQL執(zhí)行錯(cuò)誤!' || sqlerrm);   
    38. end;   
    39. /  
    轉(zhuǎn)載:http://www.javaeye.com/topic/624079

    posted on 2010-04-05 00:27 龔椿深 閱讀(1932) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产亚洲精品影视在线产品| 特级毛片全部免费播放| 国产亚洲精品自在线观看| 无码高潮少妇毛多水多水免费| 国产午夜无码精品免费看| 日韩精品无码免费视频| 亚洲人成www在线播放| 久久国产亚洲高清观看| 91麻豆国产自产在线观看亚洲| 在线免费观看国产视频| 国产精品久久久久免费a∨| 免费无码成人AV在线播放不卡| 巨胸喷奶水www永久免费| 美女18毛片免费视频| 亚洲色大成网站www尤物| 亚洲av无码一区二区三区观看| 日产亚洲一区二区三区| 亚洲AV综合色区无码一区爱AV| 在线观看亚洲精品福利片| 又粗又大又硬又爽的免费视频| 曰皮全部过程视频免费国产30分钟| 成人免费AA片在线观看| 无码av免费毛片一区二区| 2019中文字幕在线电影免费| 午夜爽爽爽男女免费观看影院| 精品免费视在线观看| 免费的全黄一级录像带| 成在人线av无码免费高潮喷水 | 黄色网址免费大全| 三年片在线观看免费大全电影 | 亚洲AV成人片色在线观看| 亚洲国产AV无码专区亚洲AV| 久久夜色精品国产亚洲| 亚洲AV无一区二区三区久久| 国产亚洲A∨片在线观看| 国产亚洲人成无码网在线观看| 亚洲精品无码精品mV在线观看| 亚洲高清国产AV拍精品青青草原| 久久精品国产亚洲综合色| 亚洲av无码成人黄网站在线观看 | 免费成人在线视频观看|