![oracle存儲(chǔ)過程調(diào)用_第1頁(yè)](http://file4.renrendoc.com/view/32751ef35216dc40a24e572e0e66d66c/32751ef35216dc40a24e572e0e66d66c1.gif)
![oracle存儲(chǔ)過程調(diào)用_第2頁(yè)](http://file4.renrendoc.com/view/32751ef35216dc40a24e572e0e66d66c/32751ef35216dc40a24e572e0e66d66c2.gif)
![oracle存儲(chǔ)過程調(diào)用_第3頁(yè)](http://file4.renrendoc.com/view/32751ef35216dc40a24e572e0e66d66c/32751ef35216dc40a24e572e0e66d66c3.gif)
![oracle存儲(chǔ)過程調(diào)用_第4頁(yè)](http://file4.renrendoc.com/view/32751ef35216dc40a24e572e0e66d66c/32751ef35216dc40a24e572e0e66d66c4.gif)
![oracle存儲(chǔ)過程調(diào)用_第5頁(yè)](http://file4.renrendoc.com/view/32751ef35216dc40a24e572e0e66d66c/32751ef35216dc40a24e572e0e66d66c5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第7講 PL/SQL 塊的結(jié)構(gòu)和實(shí)例 1PL/SQL 塊的結(jié)構(gòu)和實(shí)例學(xué)習(xí)目標(biāo)理解oracle 的pl/sql 概念掌握pl/sql 編程技術(shù)(包括編寫過程、函數(shù)、觸發(fā)器.)pl/sql 的介紹pl/sql 是什么pl/sql(procedural language/sql)是oracle 在標(biāo)準(zhǔn)的sql 語(yǔ)言上的擴(kuò)展。pl/sql 不僅允許嵌入sql 語(yǔ)言,還可以定義變量和常量,允許使用條件語(yǔ)句和循環(huán)語(yǔ)句,允許使用例外處理各種錯(cuò)誤,這樣使得它的功能變得更加強(qiáng)大。2PL/SQL 塊的結(jié)構(gòu)和實(shí)例學(xué)習(xí)必要性1.提高應(yīng)用程序的運(yùn)行性能2.模塊化的設(shè)計(jì)思想【分頁(yè)的過程,訂單的過程,轉(zhuǎn)賬的過程?!?.減少
2、網(wǎng)絡(luò)傳輸量4.提高安全性(sql 會(huì)包括表名,有時(shí)還可能有密碼,傳輸?shù)臅r(shí)候會(huì)泄露。PL/SQL就不會(huì))為什么PL/SQL 會(huì)快呢?不好的地方:移植性不好(換數(shù)據(jù)庫(kù)就用不了) 3PL/SQL 塊的結(jié)構(gòu)和實(shí)例 sqlplus 開發(fā)工具sqlplus 是oracle 公司提供的一個(gè)工具,這個(gè)因?yàn)槲覀冊(cè)谝郧敖榻B過的:舉一個(gè)簡(jiǎn)單的案例:編寫一個(gè)存儲(chǔ)過程,該過程可以向某表中添加記錄。一個(gè)簡(jiǎn)單的存儲(chǔ)過程CREATE OR REPLACE PROCEDURE proc_helloworldISBEGIN DBMS_OUTPUT.put_line (Hello World!);END;/4PL/SQL 塊的結(jié)構(gòu)
3、和實(shí)例 需要在屏幕上顯示出DBMS_OUTPUT.put_line的輸出字符串,需要做一個(gè)小小的設(shè)置SQL show serveroutputserveroutput OFF SQL set serveroutput on SQL show serveroutput ON SIZE 10000 FORMAT WORD_WRAPPED1.創(chuàng)建一個(gè)簡(jiǎn)單的表Sql 代碼1. create table mytest(name varchar2(30),passwd varchar2(30); 5PL/SQL 塊的結(jié)構(gòu)和實(shí)例 2.創(chuàng)建過程Sql 代碼1. create or replace proced
4、ure sp_pro1 is2. begin-執(zhí)行部分3. insert into mytest values(楊世順,m1234);4. end;5. /replace:表示如果有sp_pro1,就替換如何查看錯(cuò)誤信息:show error;如何調(diào)用該過程:1)exec 過程名(參數(shù)值1,參數(shù)值2.);SQL執(zhí)行2)call 過程名(參數(shù)值1,參數(shù)值2.);程序調(diào)用 6PL/SQL 塊的結(jié)構(gòu)和實(shí)例 pl/sqln developer開發(fā)工具pl/sql developer 是用于開發(fā)pl/sql 塊的集成開發(fā)環(huán)境(ide),它是一個(gè)獨(dú)立的產(chǎn)品,而不是oracle 的一個(gè)附帶品。舉一個(gè)簡(jiǎn)單案例
5、:編寫一個(gè)存儲(chǔ)過程,該過程可以刪除某表記錄。Sql 代碼1. create or replace procedure sp_pro2 is2. begin-執(zhí)行部分3. delete from mytest where name=楊世順;4. end; 7PL/SQL 塊的結(jié)構(gòu)和實(shí)例 pl/sql 基礎(chǔ)pl/sql 介紹開發(fā)人員使用pl/sql 編寫應(yīng)用模塊時(shí),不僅需要掌握sql 語(yǔ)句的編寫方法,還要掌握pl/sql 語(yǔ)句及語(yǔ)法規(guī)則。pl/sql 編程可以使用變量和邏輯控制語(yǔ)句,從而可以編寫非常有用的功能模塊。比如:分頁(yè)存儲(chǔ)過程模塊、訂單處理存儲(chǔ)過程模塊、轉(zhuǎn)賬存儲(chǔ)過程模塊。而且如果使用pl/s
6、ql 編程,我們可以輕松地完成非常復(fù)雜的查詢要求。pl/sql 可以做什么簡(jiǎn)單分類過程(存儲(chǔ)過程)函數(shù)塊(編程)觸發(fā)器包8PL/SQL 塊的結(jié)構(gòu)和實(shí)例 編寫規(guī)范編寫規(guī)范n1.注釋單行注釋 -Sql 代碼1. select * from emp where empno=7788; -取得員工信息多行注釋 /*.*/來(lái)劃分2.標(biāo)志符號(hào)的命名規(guī)范1).當(dāng)定義變量時(shí),建議用v_作為前綴v_sal2).當(dāng)定義常量時(shí),建議用c_作為前綴c_rate3).當(dāng)定義游標(biāo)時(shí),建議用_cursor 作為后綴emp_cursor4).當(dāng)定義例外時(shí),建議用e_作為前綴e_error 9PL/SQL 塊的結(jié)構(gòu)和實(shí)例 pl
7、/sql 塊介紹介紹n塊(block)是pl/sql 的基本程序單元,編寫pl/sql 程序?qū)嶋H上就是編寫pl/sql 塊,要完成相對(duì)簡(jiǎn)單的應(yīng)用功能,可能只需要編寫一個(gè)pl/sql 塊,但是如果想要實(shí)現(xiàn)復(fù)雜的功能,可能需要在一個(gè)pl/sql 塊中嵌套其它的pl/sql 塊。塊n結(jié)構(gòu)示意圖pl/sql 塊由三個(gè)部分構(gòu)成:定義部分,執(zhí)行部分,例外處理部分。如下所示:declare/*定義部分定義常量、變量、游標(biāo)、例外、復(fù)雜數(shù)據(jù)類型*/begin/*執(zhí)行部分要執(zhí)行的pl/sql 語(yǔ)句和sql 語(yǔ)句*/exception/*例外處理部分處理運(yùn)行的各種錯(cuò)誤*/end;定義部分是從declare 開始的,
8、該部分是可選的;執(zhí)行部分是從begin 開始的,該部分是必須的;例外處理部分是從exception 開始的,該部分是可選的??梢院蚸ava 編程結(jié)構(gòu)做一個(gè)簡(jiǎn)單的比較。 10PL/SQL 塊的結(jié)構(gòu)和實(shí)例 pl/sql 塊的實(shí)例(1)實(shí)例1-只包括執(zhí)行部分的pl/sql 塊nSql 代碼1. set serveroutput on -打開輸出選項(xiàng)2. begin3. dbms_output.put_line(hello);4. end;相關(guān)說(shuō)明:dbms_output 是oracle 所提供的包(類似java 的開發(fā)包),該包包含一些過程,put_line 就是dbms_output 包的一個(gè)過程
9、。 11PL/SQL 塊的結(jié)構(gòu)和實(shí)例 pl/sql 塊的實(shí)例(2)實(shí)例2-包含定義部分和執(zhí)行部分的pl/sql 塊nSql 代碼1. declare2. v_ename varchar2(5); -定義字符串變量3. begin4. select ename into v_ename from emp where empno=&aa;5. dbms_output.put_line(雇員名:|v_ename);6. end;7. /如果要把薪水也顯示出來(lái),那么執(zhí)行部分就應(yīng)該這么寫:Sql 代碼1. select ename,sal into v_ename,v_sal from emp wher
10、e empno=&aa;相關(guān)說(shuō)明:& 表示要接收從控制臺(tái)輸入的變量 12PL/SQL 塊的結(jié)構(gòu)和實(shí)例 pl/sql 塊的實(shí)例(3)實(shí)例3-包含定義部分,執(zhí)行部分和例外處理部分為了避免pl/sql 程序的運(yùn)行錯(cuò)誤,提高pl/sql 的健壯性,應(yīng)該對(duì)可能的錯(cuò)誤進(jìn)行處理,這個(gè)很有必要。1.比如在實(shí)例2 中,如果輸入了不存在的雇員號(hào),應(yīng)當(dāng)做例外處理。2.有時(shí)出現(xiàn)異常,希望用另外的邏輯處理我們看看如何完成1 的要求。相關(guān)說(shuō)明:oracle 事先預(yù)定義了一些例外,no_data_found 就是找不到數(shù)據(jù)的例外。Sql 代碼1. declare2. -定義變量3. v_ename varchar2(5);
11、4. v_sal number(7,2);5. begin6. -執(zhí)行部分7. select ename,sal into v_ename,v_sal from emp where empno=&aa;8. -在控制臺(tái)顯示用戶名9. dbms_output.put_line(用戶名是:|v_ename| 工資:|v_sal);10. -異常處理11.exception12.when no_data_found then13. dbms_output.put_line(朋友,你的編號(hào)輸入有誤!);14.end;15./13PL/SQL 塊的結(jié)構(gòu)和實(shí)例 pl/sql分類 - 過程,函數(shù),包,觸發(fā)器
12、 過程過程用于執(zhí)行特定的操作,當(dāng)建立過程時(shí),既可以指定輸入?yún)?shù)(in),也可以指定輸出參數(shù)(out), 通過在過程中使用輸入?yún)?shù),可以將數(shù)據(jù)傳遞到執(zhí)行部分;通過使用輸出參數(shù),可以將執(zhí)行部分的數(shù)據(jù)傳遞到應(yīng)用環(huán)境。在sqlplus 中可以使用create procedure 命令來(lái)建立過程。14PL/SQL 塊的結(jié)構(gòu)和實(shí)例 實(shí)例如下:1.請(qǐng)考慮編寫一個(gè)過程,可以輸入雇員名,新工資,可修改雇員的工資2.如何調(diào)用過程有兩種方法; exec call3.如何在java 程序中調(diào)用一個(gè)存儲(chǔ)過程問題:如何使用過程返回值?特別說(shuō)明:對(duì)于過程我們會(huì)在以后給大家詳細(xì)具體的介紹,現(xiàn)在請(qǐng)大家先有一個(gè)概念。create
13、 procedure sp_pro3(spName varchar2, newSal number) is-不要寫成number(3,2),表明類型就可以了,不需要大小。就好像Java 寫方法時(shí)的參數(shù)一樣Sql 代碼1. begin2. -執(zhí)行部分,根據(jù)用戶名去修改工資3. update emp set sal=newSal where ename=spName;4. end;5. /15PL/SQL 塊的結(jié)構(gòu)和實(shí)例 java 程序中調(diào)用一個(gè)存儲(chǔ)過程/演示java 程序去調(diào)用oracle 的存儲(chǔ)過程案例5. try6. /1.加載驅(qū)動(dòng)7. Class.forName(oracle.jdbc.d
14、river.OracleDriver);8. /2.得到連接9. Connection ct = DriverManager.getConnection(jdbc:oracle:thin:1521:MYORA1,scott,m123);11. /3.創(chuàng)建CallableStatement12. CallableStatement cs = ct.prepareCall(call sp_pr3(?,?);13. /4.給?賦值14. cs.setString(1,SMITH);15. cs.setInt(2,10);17. cs.execute();18. /關(guān)閉19. cs.close();2
15、0. ct.close();21. catch(Exception e)22. e.printStackTrace();23. 24. 25.16PL/SQL 塊的結(jié)構(gòu)和實(shí)例 1.使用各種if 語(yǔ)句2.使用循環(huán)語(yǔ)句3.使用控制語(yǔ)句goto 和null;條件分支語(yǔ)句pl/sql 中提供了三種條件分支語(yǔ)句ifthen,if then else,if then elsif then這里我們可以和java 語(yǔ)句進(jìn)行一個(gè)比較簡(jiǎn)單的條件判斷 if thenn問題:編寫一個(gè)過程,可以輸入一個(gè)雇員名,如果該雇員的工資低于2000,就給該員工工資增加10%。Sql 代碼1. create or replace
16、procedure sp_pro6(spName varchar2) is2. -定義3. v_sal emp.sal%type;4. begin5. -執(zhí)行6. select sal into v_sal from emp where ename=spName;7. -判斷8. if v_sal2000 then9. update emp set sal=sal+sal*10% where ename=spName;10. end if;11.end;12./17PL/SQL 塊的結(jié)構(gòu)和實(shí)例 二重條件分支 if then else問題:編寫一個(gè)過程,可以輸入一個(gè)雇員名,如果該雇員的補(bǔ)助不是0
17、 就在原來(lái)的基礎(chǔ)上增加100;如果補(bǔ)助為0 就把補(bǔ)助設(shè)為200;Sql 代碼1. create or replace procedure sp_pro6(spName varchar2) is2. -定義3. v_comm m%type;4. begin5. -執(zhí)行6. select comm into v_comm from emp where ename=spName;7. -判斷8. if v_comm0 then9. update emp set comm=comm+100 where ename=spName;10. else11. update emp set comm=comm+
18、200 where ename=spName;12. end if;13.end;14./18PL/SQL 塊的結(jié)構(gòu)和實(shí)例 多重條件分支 if then elsif thenn問題:編寫一個(gè)過程,可以輸入一個(gè)雇員編號(hào),如果該雇員的職位是PRESIDENT就給他的工資增加1000,如果該雇員的職位是MANAGER 就給他的工資增加500,其它職位的雇員工資增加200。Sql 代碼1. create or replace procedure sp_pro6(spNo number) is2. -定義3. v_job emp.job%type;4. begin5. -執(zhí)行6. select job
19、into v_job from emp where empno=spNo;7. if v_job=PRESIDENT then8. update emp set sal=sal+1000 where empno=spNo;9. elsif v_job=MANAGER then10. update emp set sal=sal+500 where empno=spNo;11. else12. update emp set sal=sal+200 where empno=spNo;13. end if;14.end;15./19PL/SQL 塊的結(jié)構(gòu)和實(shí)例 循環(huán)語(yǔ)句 loop是pl/sql 中最
20、簡(jiǎn)單的循環(huán)語(yǔ)句,這種循環(huán)語(yǔ)句以loop 開頭,以end loop 結(jié)尾,這種循環(huán)至少會(huì)被執(zhí)行一次。案例:現(xiàn)有一張表users,表結(jié)構(gòu)如下:用戶id | 用戶名請(qǐng)編寫一個(gè)過程,可以輸入用戶名,并循環(huán)添加10 個(gè)用戶到users 表中,用戶編號(hào)從1 開始增加。Sql 代碼1. create or replace procedure sp_pro6(spName varchar2) is2. -定義 :=表示賦值3. v_num number:=1;4. begin5. loop6. insert into users values(v_num,spName);7. -判斷是否要退出循環(huán)8. exi
21、t when v_num=10;9. -自增10. v_num:=v_num+1;11. end loop;12.end;13./20PL/SQL 塊的結(jié)構(gòu)和實(shí)例 循環(huán)語(yǔ)句 while 循環(huán)n基本循環(huán)至少要執(zhí)行循環(huán)體一次,而對(duì)于while 循環(huán)來(lái)說(shuō),只有條件為true時(shí),才會(huì)執(zhí)行循環(huán)體語(yǔ)句,while 循環(huán)以while.loop 開始,以end loop 結(jié)束。案例:現(xiàn)有一張表users,表結(jié)構(gòu)如下:用戶id 用戶名問題:請(qǐng)編寫一個(gè)過程,可以輸入用戶名,并循環(huán)添加10 個(gè)用戶到users 表中,用戶編號(hào)從11 開始增加。Sql 代碼1. create or replace procedure
22、sp_pro6(spName varchar2) is2. -定義 :=表示賦值3. v_num number:=11;4. begin5. while v_num=20 loop6. -執(zhí)行7. insert into users values(v_num,spName);8. v_num:=v_num+1;9. end loop;10.end;11./21PL/SQL 塊的結(jié)構(gòu)和實(shí)例 循環(huán)語(yǔ)句 for 循環(huán)n基本for 循環(huán)的基本結(jié)構(gòu)如下Sql 代碼1. begin2. for i in reverse 1.10 loop3. insert into users values (i, xi
23、aoming);4. end loop;5. end;22PL/SQL 塊的結(jié)構(gòu)和實(shí)例 我們可以看到控制變量i,在隱含中就在不停地增加。順序控制語(yǔ)句 goto,null1.goto 語(yǔ)句goto 語(yǔ)句用于跳轉(zhuǎn)到特定符號(hào)去執(zhí)行語(yǔ)句。注意由于使用goto 語(yǔ)句會(huì)增加程序的復(fù)雜性,并使得應(yīng)用程序可讀性變差,所以在做一般應(yīng)用開發(fā)時(shí),建議大家不要使用goto 語(yǔ)句?;菊Z(yǔ)法如下 goto lable,其中l(wèi)able 是已經(jīng)定義好的標(biāo)號(hào)名,Sql 代碼1. declare2. i int := 1;3. begin4. loop5. dbms_output.put_line(輸出i= | i);6. if
24、 i = 1 then7. goto end_loop;8. end if;9. i := i + 1;10. end loop;11. 12. dbms_output.put_line(循環(huán)結(jié)束);13.end;23PL/SQL 塊的結(jié)構(gòu)和實(shí)例 2.nullnull 語(yǔ)句不會(huì)執(zhí)行任何操作,并且會(huì)直接將控制傳遞到下一條語(yǔ)句。使用null語(yǔ)句的主要好處是可以提高pl/sql 的可讀性。Sql 代碼1. declare2. v_sal emp.sal%type;3. v_ename emp.ename%type;4. begin5. select ename, sal into v_ename,
25、v_sal from emp where empno =&no;6. if v_sal 3000 then7. update emp set comm = sal * 0.1 where ename = v_ename;8. else9. null;10. end if;11.end;24PL/SQL 塊的結(jié)構(gòu)和實(shí)例 PL/SQL分頁(yè)編寫分頁(yè)過程介紹分頁(yè)是任何一個(gè)網(wǎng)站(bbs,網(wǎng)上商城,blog)都會(huì)使用到的技術(shù),因此學(xué)習(xí)pl/sql編程開發(fā)就一定要掌握該技術(shù)。無(wú)返回值的存儲(chǔ)過程儲(chǔ)過程:案例:現(xiàn)有一張表book,表結(jié)構(gòu)如下:書號(hào) 書名 出版社請(qǐng)寫一個(gè)過程,可以向book 表添加書,要求通過ja
26、va 程序調(diào)用該過程。-in:表示這是一個(gè)輸入?yún)?shù),默認(rèn)為in-out:表示一個(gè)輸出參數(shù)Sql 代碼1. create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is2. begin3. insert into book values(spBookId,spbookName,sppublishHouse);4. end;5. /25PL/SQL 塊的結(jié)構(gòu)和實(shí)例 JAVA 代碼try/1.加載驅(qū)動(dòng)Class.forName(oracle.jd
27、bc.driver.OracleDriver); /2.得到連接Connection ct = DriverManager.getConnection(jdbc:oracle:1521:MYORA1,scott,m123);/3.創(chuàng)建CallableStatementCallableStatement cs = ct.prepareCall(call sp_pro7(?,?,?);/4.給?賦值 cs.setInt(1,10);cs.setString(2,笑傲江湖); cs.setString(3,人民出版社); /5.執(zhí)行cs.execute(); catch(Exception e) e
28、.printStackTrace(); finally/6.關(guān)閉各個(gè)打開的資源 cs.close(); ct.close();26PL/SQL 塊的結(jié)構(gòu)和實(shí)例 有返回值的存儲(chǔ)過程(非列表)再看如何處理有返回值的存儲(chǔ)過程:案例:編寫一個(gè)過程,可以輸入雇員的編號(hào),返回該雇員的姓名。案例擴(kuò)張:編寫一個(gè)過程,可以輸入雇員的編號(hào),返回該雇員的姓名、工資和崗位。Sql 代碼1. -有輸入和輸出的存儲(chǔ)過程2. create or replace procedure sp_pro83. (spno in number, spName out varchar2) is4. begin5. select enam
29、e into spName from emp where empno=spno;6. end;7. /27PL/SQL 塊的結(jié)構(gòu)和實(shí)例 try /1.加載驅(qū)動(dòng)Class.forName(oracle.jdbc.driver.OracleDriver);/2.得到連接 Connection ct = DriverManager.getConnection(jdbc:oracle:1521:MYORA1,scott,m123); /3.創(chuàng)建CallableStatementCallableStatement cs = ct.prepareCall(call sp_pro7(?,?,?); /4.給
30、?賦值 cs.setInt(1,10); cs.setString(2,笑傲江湖); cs.setString(3,人民出版社);*/ /看看如何調(diào)用有返回值的過程/創(chuàng)建CallableStatement /*CallableStatement cs = ct.prepareCall(call sp_pro8(?,?); /給第一個(gè)?賦值cs.setInt(1,7788);/給第二個(gè)?賦值 cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); /5.執(zhí)行 cs.execute();/取出返回值,要注意?的順序String nam
31、e=cs.getString(2);System.out.println(7788 的名字+name); catch(Exception e)e.printStackTrace(); finally/6.關(guān)閉各個(gè)打開的資源 cs.close(); ct.close(); 28PL/SQL 塊的結(jié)構(gòu)和實(shí)例 案例擴(kuò)張:編寫一個(gè)過程,可以輸入雇員的編號(hào),返回該雇員的姓名、工資和崗位。Sql 代碼1. -有輸入和輸出的存儲(chǔ)過程2. create or replace procedure sp_pro83. (spno in number, spName out varchar2,spSal out n
32、umber,spJob outvarchar2) is4. begin5. select ename,sal,job into spName,spSal,spJob from emp whereempno=spno;6. end;7. /29PL/SQL 塊的結(jié)構(gòu)和實(shí)例 try /1.加載驅(qū)動(dòng) Class.forName(oracle.jdbc.driver.OracleDriver); /2.得到連接 Connection ct = DriverManager.getConnection(jdbc:oracle:1521:MYORA1,scott,m123);/3.創(chuàng)建CallableSta
33、tement/*CallableStatement cs = ct.prepareCall(call sp_pro7(?,?,?); /4.給?賦值 cs.setInt(1,10);cs.setString(2,笑傲江湖); cs.setString(3,人民出版社);*/ /看看如何調(diào)用有返回值的過程 /創(chuàng)建CallableStatement /*CallableStatement cs = ct.prepareCall(call sp_pro8(?,?,?,?); /給第一個(gè)?賦值cs.setInt(1,7788);/給第二個(gè)?賦值cs.registerOutParameter(2,ora
34、cle.jdbc.OracleTypes.VARCHAR);/給第三個(gè)?賦值 cs.registerOutParameter(3,oracle.jdbc.OracleTypes.DOUBLE); /給第四個(gè)?賦值cs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR); /5.執(zhí)行cs.execute(); /取出返回值,要注意?的順序String name=cs.getString(2); String job=cs.getString(4);System.out.println(7788 的名字+name+ 工作:+job); c
35、atch(Exception e) e.printStackTrace(); finally /6.關(guān)閉各個(gè)打開的資源cs.close(); ct.close(); 30PL/SQL 塊的結(jié)構(gòu)和實(shí)例 案例:編寫一個(gè)過程,輸入部門號(hào),返回該部門所有雇員信息。對(duì)該題分析如下:由于oracle 存儲(chǔ)過程沒有返回值,它的所有返回值都是通過out 參數(shù)來(lái)替代的,列表同樣也不例外,但由于是集合,所以不能用一般的參數(shù),必須要用pagkage 了。所以要分兩部分:返回結(jié)果集的過程1.建立一個(gè)包,在該包中,我定義類型test_cursor,是個(gè)游標(biāo)。 如下:Sql 代碼1. create or replace
36、package testpackage as2. TYPE test_cursor is ref cursor;3. end testpackage;2.建立存儲(chǔ)過程。如下:Sql 代碼1. create or replace procedure sp_pro9(spNo in number,p_cursor outtestpackage.test_cursor) is2. begin3. open p_cursor for4. select * from emp where deptno = spNo;5. end sp_pro9;31PL/SQL 塊的結(jié)構(gòu)和實(shí)例 1. import jav
37、a.sql.*;2. public class Test23. public static void main(String args)4.5. try6. /1.加載驅(qū)動(dòng)7. Class.forName(oracle.jdbc.driver.OracleDriver);8. /2.得到連接9. Connection ct = DriverManager.getConnection(jdbc:oracle:1521:MYORA1,scott,m123);10.11. /看看如何調(diào)用有返回值的過程12. /3.創(chuàng)建CallableStatement13. /*CallableStatement
38、cs = ct.prepareCall(call sp_pro9(?,?);14.15. /4.給第?賦值16. cs.setInt(1,10);17. /給第二個(gè)?賦值18. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);19.20. /5.執(zhí)行21. cs.execute();22. /得到結(jié)果集23. ResultSet rs=(ResultSet)cs.getObject(2);24. while(rs.next()25. System.out.println(rs.getInt(1)+ +rs.getString(
39、2);26. 27. catch(Exception e)28. e.printStackTrace();29. finally30. /6.關(guān)閉各個(gè)打開的資源31. cs.close();32. ct.close();33. 34. 35.32PL/SQL 塊的結(jié)構(gòu)和實(shí)例 編寫分頁(yè)過程有了上面的基礎(chǔ),相信大家可以完成分頁(yè)存儲(chǔ)過程了。要求,請(qǐng)大家編寫一個(gè)存儲(chǔ)過程,要求可以輸入表名、每頁(yè)顯示記錄數(shù)、當(dāng)前頁(yè)。返回總記錄數(shù),總頁(yè)數(shù),和返回的結(jié)果集。如果大家忘了oracle 中如何分頁(yè),請(qǐng)參考第三天的內(nèi)容。先自己完成,老師在后面給出答案,并講解。-oracle 的分頁(yè)Sql 代碼1. select t
40、1.*, rownum rn from (select * from emp) t1 where rownum=10;2. -在分頁(yè)時(shí),大家可以把下面的sql 語(yǔ)句當(dāng)做一個(gè)模板使用3. select * from4. (select t1.*, rownum rn from (select * from emp) t1 where rownum=6;-開發(fā)一個(gè)包-建立一個(gè)包,在該包中,我定義類型test_cursor,是個(gè)游標(biāo)。 如下:Sql 代碼1. create or replace package testpackage as2. TYPE test_cursor is ref curs
41、or;3. end testpackage;4. -開始編寫分頁(yè)的過程5. create or replace procedure fenye6. (tableName in varchar2,7. Pagesize in number,-一頁(yè)顯示記錄數(shù)8. pageNow in number,9. myrows out number,-總記錄數(shù)10. myPageCount out number,-總頁(yè)數(shù)11. p_cursor out testpackage.test_cursor-返回的記錄集12. ) is13.-定義部分14.-定義sql 語(yǔ)句 字符串15.v_sql varchar
42、2(1000);16.-定義兩個(gè)整數(shù)17.v_begin number:=(pageNow-1)*Pagesize+1;18.v_end number:=pageNow*Pagesize;19.begin20.-執(zhí)行部分21.v_sql:=select * from (select t1.*, rownum rn from (select * from |tableName|) t1 where rownum=|v_begin;22.-把游標(biāo)和sql 關(guān)聯(lián)23.open p_cursor for v_sql;24.-計(jì)算myrows 和myPageCount25.-組織一個(gè)sql 語(yǔ)句26.v_sql:=select count(*) from |tableName;27.-執(zhí)行sql,并把返回的值,賦給myrows;28.execute immediate v_sql into myrows;29.-計(jì)算myPageCount30.-if myrows%Pagesize=0 then 這樣寫是錯(cuò)的31.if mod(myrows,Pagesize)=0 then32. myPageCount:=myrows/Pagesize;33.else34. myPageCount:=myrows/Pagesize+1;35.end if;36.-關(guān)閉游
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 借錢補(bǔ)充合同范本寫
- 倉(cāng)儲(chǔ)送貨批發(fā)合同范例
- 一次合同范本
- 關(guān)于轉(zhuǎn)讓車輛合同范本
- 勞務(wù)派遣保潔合同范本
- 產(chǎn)權(quán)經(jīng)紀(jì)合同范本
- 出租兒童書架合同范例
- 2025年度化工產(chǎn)品綠色包裝設(shè)計(jì)與采購(gòu)合同
- 修車搬運(yùn)服務(wù)合同范本
- 2025年精煉銅線項(xiàng)目投資可行性研究分析報(bào)告
- 護(hù)理三基三嚴(yán)習(xí)題+參考答案
- 2025門診護(hù)理工作計(jì)劃
- 員工互評(píng)表(含指標(biāo))
- 電氣領(lǐng)域知識(shí)培訓(xùn)課件
- 山東省部分學(xué)校2024-2025學(xué)年高一上學(xué)期12月選科指導(dǎo)聯(lián)合測(cè)試地理試題( 含答案)
- focus-pdca改善案例-提高護(hù)士對(duì)糖尿病患者胰島素注射部位正確輪換執(zhí)行率
- 八年級(jí)物理下冊(cè)全冊(cè)課課練【全冊(cè)每課齊全】
- 美國(guó)電話區(qū)號(hào)一覽表
- 針對(duì)老年人的交通安全宣傳
- 2023年廣東省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 中央空調(diào)系統(tǒng)維保服務(wù)報(bào)價(jià)清單
評(píng)論
0/150
提交評(píng)論