下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ORACLE 數(shù)據(jù)庫(kù)第 4 章ORACLE 編程播客.程序員一、PL/SQL(一)PL/SQLPL/SQL(Procedure Language/SQL)是 Oracle 對(duì) sql 語(yǔ)言的過(guò)程化擴(kuò)展,指在SQL 命令語(yǔ)言中增加了過(guò)程處理語(yǔ)句(如分支、循環(huán)等),使 SQL 語(yǔ)言具有過(guò)程處理能力。把 SQL 語(yǔ)言的數(shù)據(jù)能力與過(guò)程語(yǔ)言的數(shù)據(jù)處理能力結(jié)合起來(lái),使得PLSQL 面向過(guò)程但比過(guò)程語(yǔ)言簡(jiǎn)單、高效、靈活和實(shí)用?;菊Z(yǔ)法結(jié)構(gòu)(二)變量變量的語(yǔ)法:變量賦值的語(yǔ)法:變量的變量名:=變量值變量名 類型(長(zhǎng)度);declare -變量 begin -代碼邏輯 exception -異常處理 end;需
2、求:變量水費(fèi)單價(jià)、水費(fèi)字?jǐn)?shù)、噸數(shù)、金額。對(duì)水費(fèi)單價(jià)、字?jǐn)?shù)、進(jìn)行賦值 。噸數(shù)根據(jù)水費(fèi)字?jǐn)?shù)換算,規(guī)則為水費(fèi)字?jǐn)?shù)除以1000,并且四舍五入,保留兩位小數(shù)。計(jì)算金額,金額=單價(jià)*噸數(shù)。輸出單價(jià)、數(shù)量和金額。Selecto 方式 賦值語(yǔ)法結(jié)構(gòu):declarebegin v_usenum2:= round( v_usenum/1000,2); v_money:=round(v_price*v_usenum2,2);end;-變量的用法-dbms_output.put_line(單價(jià):|v_price|噸數(shù):|v_usenum2|金額:|v_money);-計(jì)算金額v_price:=2.45;-水費(fèi)單價(jià)v_
3、usenum:=8012;-字?jǐn)?shù)-字?jǐn)?shù)換算為噸數(shù)v_pricenumber(10,2);-水費(fèi)單價(jià)v_usenum number;-水費(fèi)字?jǐn)?shù)v_usenum2 number(10,2);-噸數(shù)v_moneynumber(10,2);-金額注意:結(jié)果必須是一條,有多條和沒有都會(huì)報(bào)錯(cuò)(三)屬性類型型%TYPEdeclarev_price number(10,2);-單價(jià) v_usenum number;-水費(fèi)字?jǐn)?shù) v_num0 number;-上月字?jǐn)?shù) v_num1 number;-本月字?jǐn)?shù)v_usenum2 number(10,2);-使用噸數(shù)v_money number(10,2);-水費(fèi)金額
4、 begin v_price:=3.45; select usenum,num0,num1o v_usenum,V_num0,V_num1 from T_ACCOUNT where year=2012 and month=01 and owneruuid=1; v_usenum2:= round(v_usenum/1000,2); v_money:=v_price*v_usenum2; DBMS_OUTPUT.put_line(單價(jià):|v_price|噸數(shù):|v_usenum2|金額:|v_money|上月字?jǐn)?shù):|v_num0|本月字?jǐn)?shù)|v_num1); end;-變量賦值-對(duì)單價(jià)進(jìn)行賦值se
5、lect 列名o變量名 from 表名 where 條件作用:某表某列的字段類型型,上例中的例子可以用下面的代碼代替%ROWTYPE作用:標(biāo)識(shí)某個(gè)表的行類型declarev_price number(10,2);-單價(jià)v_usenum T_ACCOUNT.USENUM%TYPE;-水費(fèi)字?jǐn)?shù) v_num0 T_ACCOUNT.NUM0%TYPE;-上月字?jǐn)?shù) v_num1 T_ACCOUNT.NUM1%TYPE;-本月字?jǐn)?shù) v_usenum2 number(10,2);-使用噸數(shù)v_money number(10,2);-水費(fèi)金額 begin v_price:=3.45; -v_usenum:=8
6、090; select usenum,num0,num1o v_usenum,V_num0,V_num1 from T_ACCOUNT where year=2012 and month=01 and owneruuid=1; v_usenum2:= round(v_usenum/1000,2); v_money:=v_price*v_usenum2; DBMS_OUTPUT.put_line(單價(jià):|v_price|噸數(shù):|v_usenum2|金額:|v_money|上月字?jǐn)?shù):|v_num0|本月字?jǐn)?shù)|v_num1); end;-計(jì)算金額-使用噸數(shù)-對(duì)單價(jià)進(jìn)行賦值(四)異常在運(yùn)行程序時(shí)出現(xiàn)的
7、錯(cuò)誤叫做異常發(fā)生異常后,語(yǔ)句將停止執(zhí)行,控制權(quán)轉(zhuǎn)移到 PL/SQL 塊的異常處理部分異常有兩種類型:declarev_price number(10,2);-單價(jià) v_account T_ACCOUNT%ROWTYPE;-型 v_usenum2 number(10,2);-使用噸數(shù)v_money number(10,2);-水費(fèi)金額 begin v_price:=3.45; select *o v_account from T_ACCOUNT where year=2012 and month=01 and owneruuid=1; v_usenum2:= round(v_account.us
8、enum/1000,2); v_money:=v_price*v_usenum2; DBMS_OUTPUT.put_line(單價(jià):|v_price|噸數(shù):|v_usenum2|金額:|v_money|上月字?jǐn)?shù):|v_account.num0|本月字?jǐn)?shù)|v_account.num1); end;-變量的用法-計(jì)算金額-使用噸數(shù)-賦值-對(duì)單價(jià)進(jìn)行賦值預(yù)定義異常 -當(dāng) PL/SQL 程序Oracle 規(guī)則或系統(tǒng)限制時(shí)隱式用戶定義異常-用戶可以在 PL/SQL 塊的部分定義異常,自定義的異常通過(guò) RAISE 語(yǔ)句顯式預(yù)定義異常Oracle 預(yù)定義異常 21 個(gè)命名的系統(tǒng)異常產(chǎn)生原因未定義對(duì)象ACS_
9、O_NULLCASE_NOT_FOUNDCASE 中若未包含相應(yīng)的 WHEN ,并且沒有設(shè)置 ELSE 時(shí)COLLECTION_IS_NULL集合元素未初始化CURSER_ALREADY_OPEN游標(biāo)已經(jīng)打開DUP_VAL_ON_INDEX唯一索引對(duì)應(yīng)的列上有重復(fù)的值INVALID_CURSOR在不合法的游標(biāo)上進(jìn)行操作INVALID_NUMBER內(nèi)嵌的 SQL 語(yǔ)句不能將字符轉(zhuǎn)換為數(shù)字NO_DATA_FOUND使用 selecto 未返回行TOO_MANY_ROWS執(zhí)行 selecto 時(shí),結(jié)果集超過(guò)一行ZERO_DIVIDE除數(shù)為 0SUBSCRIPT_BEYOND_COUNT元素下標(biāo)超過(guò)嵌
10、套表或 VARRAY 的最大值SUBSCRIPT_OUTSIDE_LIMIT使用嵌套表或 VARRAY 時(shí),將下標(biāo)指定為負(fù)數(shù)VALUE_ERROR賦值時(shí),變量長(zhǎng)度以容納實(shí)際數(shù)據(jù)LOGIN_DENIEDPL/SQL 應(yīng)用程序連接到 oracle 數(shù)據(jù)庫(kù)時(shí),提供了不正確的用戶名或NOT_LOGGED_ONPL/SQL 應(yīng)用程序在沒有連接 oralce 數(shù)據(jù)庫(kù)的情況下數(shù)據(jù)PROGRAM_ERRORPL/SQL問(wèn)題,可能需要重裝數(shù)據(jù)字典 pl./SQL 系統(tǒng)包ROWTYPE_MISMATCH宿主游標(biāo)變量與 PL/SQL 游標(biāo)變量的返回類型不兼容SELF_IS_NULL使用對(duì)象類型時(shí),在 null 對(duì)象
11、上調(diào)用對(duì)象方法STORAGE_ERROR運(yùn)行 PL/SQL 時(shí),超出內(nèi)存空間SYS_INVALID_ID無(wú)效的 ROWID 字符串TIMEOUT_ON_RESOURCEOracle 在等待資源時(shí)超時(shí)語(yǔ)法結(jié)構(gòu):根據(jù)上例中的代碼,添加異常處理部分-變量的用法-declarebegin select usenumo v_usenum from T_ACCOUNT where owneruuid=1 and year=2012 and month=01; v_usenum2:= round( v_usenum/1000,3);exception when NO_DATA_FOUND then when
12、 TOO_MANY_ROWS thendbms_output.put_line(未找到數(shù)據(jù),請(qǐng)核實(shí));-計(jì)算金額v_money:=round(v_price*v_usenum2,2);dbms_output.put_line(單價(jià):|v_price|噸數(shù):|v_usenum2|金額:|v_money);-字?jǐn)?shù)換算為噸數(shù)v_price:=2.45;-水費(fèi)單價(jià)v_pricenumber(10,2);-水費(fèi)單價(jià)v_usenum T_ACCOUNT.USENUM%type; -水費(fèi)字?jǐn)?shù)v_usenum2 number(10,3);-噸數(shù)v_moneynumber(10,2);-金額exceptionw
13、hen 異常類型then異常處理邏輯(五)條件判斷基本語(yǔ)法 1基本語(yǔ)法 2基本語(yǔ)法 3需求:設(shè)置三個(gè)等級(jí)的水費(fèi)5 噸以下 2.45 元/噸5 噸到 10 噸部分 3.45 元/噸,超過(guò) 10 噸部分 4.45 ,根據(jù)使用水費(fèi)的量來(lái)計(jì)算階梯水費(fèi)。v_price2 number(10,2);-超過(guò) 5 噸10 噸單價(jià)v_price3 number(10,2);-超過(guò) 10 噸單價(jià)declarev_price1 number(10,2);-5 噸的單價(jià)if 條件 then業(yè)務(wù)邏輯elsif 條件 then業(yè)務(wù)邏輯else業(yè)務(wù)邏輯end if; if 條件 then業(yè)務(wù)邏輯 else業(yè)務(wù)邏輯 end
14、if;if 條件 then業(yè)務(wù)邏輯end if;end;dbms_output.put_line(查詢條件有誤,返回多條信息,請(qǐng)核實(shí));begin select *o v_account from T_ACCOUNT where year=2012 and month=01 and owneruuid=1; v_usenum2:= round(v_account.usenum/1000,2);-計(jì)算金額(階梯水費(fèi))if v_usenum25 and v_usenum2100; end loop; end ;loop -循環(huán)語(yǔ)句end loop;exception when NO_DATA_FO
15、UND then when TOO_MANY_ROWS thenend;DBMS_OUTPUT.put_line(返回的數(shù)據(jù)有多行);DBMS_OUTPUT.put_line(沒有找到數(shù)據(jù));范例:輸出從1開始的100個(gè)數(shù)3、for循環(huán)基本語(yǔ)法范例:輸出從1開始的100個(gè)數(shù)(七)游標(biāo)游標(biāo)1.游標(biāo)是系統(tǒng)為用戶開設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放 SQL 語(yǔ)句的執(zhí)行結(jié)果??梢园延螛?biāo)理解為 PL/SQL 中的結(jié)果集。beginfor v_num in 1.100loopdbms_output.put_line(v_num);end loop; end;for 變量 in 起始值.終止值 loopend loo
16、p;declarev_num number:=1; begin while v_num=100 loopdbms_output.put_line(v_num);v_num:=v_num+1; end loop;end ;end loop;2.語(yǔ)法結(jié)構(gòu)及示例在區(qū)游標(biāo),語(yǔ)法如下:使用游標(biāo)語(yǔ)法需求:打印業(yè)主類型為 1 的價(jià)格表代碼:declare cursor cur_pricetable iect * from T_PRICETABLE wherebeginownertypeid=1;-定義游標(biāo)v_pricetable T_PRICETABLE%rowtype;-價(jià)格行對(duì)象loopfetch 游標(biāo)
17、名稱o 變量exitwhen游標(biāo)名稱%notfound end loop;close 游標(biāo)名稱open 游標(biāo)名稱cursor 游標(biāo)名稱 is SQL 語(yǔ)句;運(yùn)行結(jié)果如下:3.帶參數(shù)的游標(biāo)的查詢語(yǔ)句的條件值有可能是在運(yùn)行時(shí)才能決定的,比如性業(yè)主類型,可能是運(yùn)行時(shí)才可以決定,那如何實(shí)現(xiàn)呢?接下來(lái)學(xué)習(xí)帶參數(shù)的游標(biāo),修改上述案例declare cursor cur_pricetable(v_ownertypeid number) iect *beginfrom T_PRICETABLE where ownertypeid=v_ownertypeid;-定義游標(biāo)v_pricetable T_PRICET
18、ABLE%rowtype;-價(jià)格行對(duì)象loopfetch cur_pricetableo v_pricetable;-提取游標(biāo)到變量 exit when cur_pricetable%notfound;-當(dāng)游標(biāo)到最后一行下面退出循環(huán)dbms_output.put_line( 價(jià)格:|v_pricetable.price |噸位: |v_pricetable.minnum|-|v_pricetable.maxnum ); end loop;end ;open cur_pricetable;-打開游標(biāo)close cur_pricetable;-關(guān)閉游標(biāo)4. for 循環(huán)提取游標(biāo)值每次提取游標(biāo),需要
19、打開游標(biāo)關(guān)閉游標(biāo) 循環(huán)游標(biāo) 提取游標(biāo)控制循環(huán)的退出等等,好麻煩!有沒有更簡(jiǎn)單的寫法呢?有!用 for 循環(huán)一切都那么簡(jiǎn)單,上例的代碼可以改造為下列形式declare cursor cur_pricetable(v_ownertypeid number) iect *begin for v_pricetable in cur_pricetable(3) loop end loop; end ;dbms_output.put_line(價(jià)格:|v_pricetable.price |噸位:|v_pricetable.minnum|-|v_pricetable.maxnum );from T_PRI
20、CETABLE where ownertypeid=v_ownertypeid;-定義游標(biāo)loopfetch cur_pricetableo v_pricetable;-提取游標(biāo)到變量 exit when cur_pricetable%notfound;-當(dāng)游標(biāo)到最后一行下面退出循環(huán)dbms_output.put_line(價(jià)格:|v_pricetable.price |噸位:|v_pricetable.minnum|-|v_pricetable.maxnum ); end loop;end ;open cur_pricetable(2);-打開游標(biāo)close cur_pricetable;-
21、關(guān)閉游標(biāo)二、函數(shù)(一)函數(shù)函數(shù)又稱為自定義函數(shù)??梢越邮找粋€(gè)或多個(gè)參數(shù),返回一個(gè)結(jié)果。在函數(shù)中可以使用 P/SQL 進(jìn)行邏輯的處理。(二)函數(shù)語(yǔ)法結(jié)構(gòu)創(chuàng)建或修改過(guò)程的語(yǔ)法如下:CREATE OR REPLACE FUNCTION函數(shù)名稱(參數(shù)名稱 參數(shù)類型, 參數(shù)名稱 參數(shù)類型, .) RETURN 結(jié)果變量數(shù)據(jù)類型IS變量部分; BEGIN邏輯部分;RETURN 結(jié)果變量; EXCEPTION異常處理部分END;(三)案例需求: 創(chuàng)建函數(shù),根據(jù)地址 ID 查詢地址名稱。語(yǔ)句:測(cè)試此函數(shù):輸出內(nèi)容需求:查詢業(yè)主ID,業(yè)主名稱,業(yè)主地址,業(yè)主地址使用剛才創(chuàng)建的函數(shù)來(lái)實(shí)現(xiàn)。查詢結(jié)果如下:from
22、t_ownersselect id,name 業(yè)主名稱,fn_getaddress(addre) 地址select fn_getaddress(3) from dualreturn varchar2 is v_name varchar2(30); begin select nameo v_name from t_address where id=v_id; return v_name; end;create function fn_getaddress(v_id number)三、過(guò)程(一)過(guò)程過(guò)程是被命名的 PL/SQL 塊,于數(shù)據(jù)庫(kù)中,是數(shù)據(jù)庫(kù)對(duì)象的一種。應(yīng)用程序可以調(diào)用過(guò)程,執(zhí)行相應(yīng)的邏
23、輯。過(guò)程與函數(shù)都可以封裝一定的業(yè)務(wù)邏輯并返回結(jié)果,存在區(qū)別如下:1、函數(shù)中有返回值,且必須返回;而過(guò)程沒有返回值,可以通過(guò)傳出參數(shù)返回多個(gè)值。2、函數(shù)可以在 select 語(yǔ)句中直接使用,而過(guò)程不能。過(guò)程多數(shù)是被應(yīng)用程序所調(diào)用。3、函數(shù)一般都是封裝一個(gè)查詢結(jié)果,而過(guò)程一般都封裝一段事務(wù)代碼。(二)過(guò)程語(yǔ)法結(jié)構(gòu)創(chuàng)建或修改過(guò)程的語(yǔ)法如下:CREATE OR REPLACE PROCEDURE過(guò)程名稱(參數(shù)名 類型, 參數(shù)名 類型, 參數(shù)名 類型)IS|AS變量部分;參數(shù)只指定類型,不指定長(zhǎng)度過(guò)程參數(shù)的三種模式:IN傳入?yún)?shù)(默認(rèn))OUT 傳出參數(shù) ,主要用于返回程序運(yùn)行結(jié)果IN OUT 傳入傳出參
24、數(shù)(三)案例1. 創(chuàng)建不帶傳出參數(shù)的過(guò)程:添加create sequeneq_owners start with 11;create or replace procedure pro_owners_add ( v_name varchar2, v_addre number, v_housenumber varchar2, v_watermeter varchar2, v_type number)isbegin-增加序列-增加過(guò)程BEGIN邏輯部分EXCEPTION異常處理部分 END;PL/SQL 中調(diào)用過(guò)程JDBC 調(diào)用過(guò)程/*增加param owners*/public sic void
25、add(Owners owners)java.sql.Connection conn=null; java.sql.CallableSement stmt=null;try conn=Base.getConnection(); stmt=conn.prepareCall(callpro_owners_add(?,?,?,?,?);stmt.setString(1, owners.getName(); stmt.setLong(2, owners.getAddre(); stmt.setString(3, owners.getHousenumber(); stmt.setString(4, ow
26、ners.getWatermeter(); stmt.setLong(5, owners.getOwnertypeid();stmt.execute(); catch (SQLException e) e.prStackTrace();finally Base.closeAll(null, stmt, conn);call pro_owners_add(,1,999-3,132-7,1);inserto T_OWNERSvalues( seq_owners.nextval,v_name,v_addre,v_housenumb er,v_watermeter,sysdate,v_type );
27、commit;end;2 創(chuàng)建帶傳出參數(shù)的過(guò)程需求:添加,傳出參數(shù)為新增業(yè)主的 IDPL/SQL 調(diào)用該過(guò)程執(zhí)行成功后輸出結(jié)果:JDBC 調(diào)用過(guò)程declareend;v_id number;-定義傳出參數(shù)的變量beginpro_owners_add(王,1,922-3,133-7,1,v_id);DBMS_OUTPUT.put_line(增加成功,ID:|v_id);create or replace procedure pro_owners_add ( v_name varchar2, v_addre number, v_housenumber varchar2, v_watermeter
28、 varchar2, v_type number, v_id out number)is begin select seq_owners.nextvalo v_id from dual; inserto T_OWNERSvalues( v_id,v_name,v_addre,v_housenumber,v_watermete r,sysdate,v_type ); commit; end;-增加過(guò)程四、觸發(fā)器(一)觸發(fā)器數(shù)據(jù)庫(kù)觸發(fā)器是一個(gè)與表相關(guān)聯(lián)的、的 PL/SQL 程序。每當(dāng)一個(gè)特定的數(shù)據(jù)操作語(yǔ)句(Insert,update,delete)在指定的表上發(fā)出時(shí),Oracle 自動(dòng)地執(zhí)行觸發(fā)器
29、中定義的語(yǔ)句序列。/*增加param owners*/public sic long add(Owners owners)long id=0;java.sql.Connection conn=null; java.sql.CallableSement stmt=null; try conn=Base.getConnection(); stmt=conn.prepareCall(callpro_owners_add(?,?,?,?,?,?);stmt.setString(1, owners.getName(); stmt.setLong(2, owners.getAddre(); stmt.se
30、tString(3, owners.getHousenumber(); stmt.setString(4, owners.getWatermeter(); stmt.setLong(5, owners.getOwnertypeid();stmt.registerOutParameter(6, OracleTypes.NUMBER);/注冊(cè)傳出參數(shù)類型stmt.execute(); id=stmt.getLong(6);/提取傳出參數(shù) catch (SQLException e) e.prStackTrace();finally Base.closeAll(null, stmt, conn);r
31、eturn id;觸發(fā)器可用于數(shù)據(jù)確認(rèn)實(shí)施復(fù)雜的安全性檢查做審計(jì),表上所做的數(shù)據(jù)操作等數(shù)據(jù)的備份和同步觸發(fā)器分類前置觸發(fā)器(BEFORE)后置觸發(fā)器(AFTER)(二)創(chuàng)建觸發(fā)器的語(yǔ)法語(yǔ)法:FOR EACH ROW 作用是標(biāo)注此觸發(fā)器是行級(jí)觸發(fā)器語(yǔ)句級(jí)觸發(fā)器在觸發(fā)器中觸發(fā)語(yǔ)句與偽變量的值觸發(fā)語(yǔ)句:old:newInsert所有字段都是空(null)將要的數(shù)據(jù)Update更新以前該行的值更新后的值 BEFORE | AFTER DELETE or INSERT orUPDATE OF 列名 ON 表名 FOR EACH ROW WHEN(條件) declarebegin PLSQL 塊End ;
32、CREATE or REPLACE TRIGGER 觸發(fā)器名(三)案例1. 前置觸發(fā)器需求:當(dāng)用戶輸入本月累計(jì)表數(shù)后,自動(dòng)計(jì)算出本月使用數(shù)。代碼:2. 后置觸發(fā)器需求:當(dāng)用戶修改了表的數(shù)據(jù)時(shí)修改前與修改后的值create table t_owners_log (updatetime date, ownerid number, oldname varchar2(30), newname varchar2(30);create trigger tri_owners_log afterupdate of name on t_owners-創(chuàng)建業(yè)主名稱修改日志表:用于業(yè)主更改前后的名稱-創(chuàng)建后置觸發(fā)器
33、,自動(dòng)業(yè)主更改前后日志beforeupdate of num1 on t_account for each row declarebegin :new.usenum:=:new.num1-:new.num0; end;create or replace trigger tri_account_updatenum1delete刪除以前該行的值所有字段都是空(null)測(cè)試:五、綜合案例1. 編寫PL/SQL ,用水噸數(shù) 12 噸,業(yè)主類型為 1,計(jì)算階梯水費(fèi)。思路分析:水費(fèi)是實(shí)行階梯計(jì)算的,查詢價(jià)格表主類型為 1 的水費(fèi)價(jià)格minnum 為下限值 ,maxnum 為上限值。上邊的的含義是5 噸以
34、下的價(jià)格為 2.45超過(guò) 5 噸10 噸的價(jià)格為 3.45超過(guò) 10 噸以上的價(jià)格為 4.45commit;select * from t_owners_log;-更新數(shù)據(jù)-查詢?nèi)罩颈韚pdate t_owners set name=楊 where id=3;declare begin inserto t_owners_logvalues(sysdate,:old.id,:,:); end;for each row如果噸數(shù)為 12。計(jì)算如下:考慮到階梯的層次可能是不確定的,所以需要通過(guò)游標(biāo)查詢出階梯價(jià)格記錄,然后計(jì)算每一階梯的水費(fèi),然后相加。偽代碼如下:語(yǔ)句:d
35、eclarev_ownertypeid number;-業(yè)主類型 ID金額=0循環(huán)價(jià)格表if( 上限值為空 或者 總噸數(shù)上限值) - 最高階梯/此為最后階梯,數(shù)量為超過(guò)上限值部分的噸數(shù)金額=金額+ 價(jià)格*(總噸數(shù)- 上限值)退出循環(huán)else/此為非最后階梯 ,數(shù)量為區(qū)間內(nèi)的噸數(shù)金額=金額+ 價(jià)格*(上限值- 下限值)函數(shù)綜合案例:創(chuàng)建計(jì)算階梯水費(fèi)的函數(shù),參數(shù)為業(yè)主類型、噸數(shù)。2.create or replace function fn_calmoney(v_ownertypeidbegin v_ownertypeid:=1; v_usenum2:=12; v_money:=0; for v_
36、pricetable in cur_pricetable(v_ownertypeid) loopif v_pricetable.maxnum is null or v_usenum2=v_pricetable.maxnum thenv_money:=v_money+ v_pricetable.price*(v_usenum2-v_pricetable.minnum);exit;elsev_money:=v_money+ v_pricetable.price*(v_pricetable.maxnum-v_pricetable.minn um);end if; end loop;end;t_pri
37、cetable where ownertypeid=v_type;-價(jià)格游標(biāo)v_usenum2 number(10,2);-總噸數(shù)DBMS_OUTPUT.put_line(階梯水費(fèi)金額:|v_money);-非最后階梯(上限值-下限值)* 價(jià)格-最后階梯(總噸數(shù)-下限值)*價(jià)格v_pricetable t_pricetable%rowtype;-每階梯價(jià)格對(duì)象cursor cur_pricetable(v_type number) iect * fromv_money number(10,2);-總金額測(cè)試此函數(shù):select fn_calmoney(1,12) from dual;numbe
38、r,v_usenum2 number) return numberis cursor cur_pricetable(v_type number) iect * frombegin for v_pricetable in cur_pricetable(v_ownertypeid) loopif v_usenum2= v_pricetable.maxnum or v_pricetable.maxnum is null thenv_money:=v_money+ v_pricetable.price* ( v_usenum2 - v_pricetable.minnum);exit;v_money:=v_money+ v_pricetable.price* (v_pricetable.maxnum-v_pricetable.minnum );end if; end loop; return v_money; end;else- 價(jià)格*(此階梯上限值-此階梯下限值)-計(jì)算階梯水費(fèi)-如果水費(fèi)小于最大值,或最大值為 null 表示此階梯為最后一個(gè)階梯,-價(jià)格*(總噸數(shù)-此階梯下限值)v_money:=0;-金額t_pricetable where ownertypeid=v_type order by minnum;-定義游標(biāo)v_pricetable t_pr
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程造價(jià)考試題庫(kù)及答案解析
- 塑料加工藝實(shí)施工程師面試問(wèn)題集
- 騰訊IT工程師面試題及解析
- 2025年人工智能客戶服務(wù)系統(tǒng)研發(fā)項(xiàng)目可行性研究報(bào)告
- 2025年農(nóng)產(chǎn)品區(qū)塊鏈追溯系統(tǒng)可行性研究報(bào)告
- 2025年自助服務(wù)技術(shù)在零售的應(yīng)用可行性研究報(bào)告
- 2025年企業(yè)ESG報(bào)告自動(dòng)生成系統(tǒng)可行性研究報(bào)告
- 2025年生態(tài)修復(fù)與環(huán)境治理項(xiàng)目可行性研究報(bào)告
- 2025年區(qū)域性物流園區(qū)建設(shè)可行性研究報(bào)告
- 2025年未來(lái)出行綜合服務(wù)平臺(tái)項(xiàng)目可行性研究報(bào)告
- 牛頓介紹課件
- 氧化還原反應(yīng)的電化學(xué)基礎(chǔ)試題及答案
- 三亞2025年海南三亞口腔醫(yī)學(xué)中心校園招聘67人筆試歷年參考題庫(kù)附帶答案詳解
- 2025-2030年中國(guó)電子衡器市場(chǎng)發(fā)展現(xiàn)狀規(guī)劃分析報(bào)告
- 2024年第18屆全國(guó)初中應(yīng)用物理知識(shí)競(jìng)賽試題及答案
- 沐足行業(yè)嚴(yán)禁黃賭毒承諾書
- 【課件】第21課《小圣施威降大圣》課件2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)
- 【MOOC】C語(yǔ)言程序設(shè)計(jì)-華中科技大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 【MOOC】C程序設(shè)計(jì)-西北工業(yè)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 南京信息工程大學(xué)《人工智能導(dǎo)論Ⅰ》2022-2023學(xué)年期末試卷
- 第14章人工智能安全
評(píng)論
0/150
提交評(píng)論