《SQL 21日自学通(V3.0)(PDF格式)》第128章


401 
…………………………………………………………Page 402……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪 
10 order by 2; 3 desc; 
输出 
NAME PAY_TYPE PAY_RATE EFF_DATE DUE 
SANDRA SAMUELS HOURLY 12。50 01…JAN…97 No 
ROBERT BOBAY HOURLY 11。50 15…MAY…96 YES 
KEITH JONES HOURLY 10。00 31…OCT…96 YES 
SUSAN WILLIAMS HOURLY 9。75 01…MAY…97 No 
CHRISSY ZOES SALARY 50000。00 01…JAN…97 No 
CLODE EVANS SALARY 42150。00 01…MAR…97 No 
JOHN SMITH SALARY 35000。00 15…JUN…96 YES 
KEVIN TROLLBERG SALARY 27500。00 15…JUN…96 YES 
DUE 列的内容是确定每一个人是否有增加工资的资格 下边是 PL/SQL 的脚本 
输入 
set serveroutput on 
BEGIN 
DECLARE 
UnknownPayType exception; 
cursor pay_cursor is 
select name; pay_type; pay_rate; eff_date; 
sysdate; rowid 
from pay_table; 
IndRec pay_cursor%ROWTYPE; 
cOldDate date; 
fNewPay number(8;2); 
BEGIN 
open pay_cursor; 
loop 
fetch pay_cursor into IndRec; 
exit when pay_cursor%NOTFOUND; 
cOldDate := sysdate 180; 
if (IndRec。pay_type = "SALARY") then 
402 
…………………………………………………………Page 403……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪 
fNewPay := IndRec。pay_rate * 1。05; 
elsif (IndRec。pay_type = "HOURLY") then 
fNewPay := IndRec。pay_rate * 1。04; 
else 
raise UnknownPayType; 
end if; 
if (IndRec。eff_date 《 cOldDate) then 
update pay_table 
set pay_rate = fNewPay; 
prev_pay = IndRec。pay_rate; 
eff_date = IndRec。sysdate 
where rowid = IndRec。rowid; 
mit; 
end if; 
end loop; 
close pay_cursor; 
EXCEPTION 
when UnknownPayType then 
dbms_output。put_line("======================="); 
dbms_output。put_line("ERROR: Aborting program。"); 
dbms_output。put_line("Unknown Pay Type for Name"); 
when others then 
dbms_output。put_line("ERROR During Processing。 See the DBA。"); 
END; 
END; 
/ 
你是否已经决定了要给这四个雇员增加工资 在上边的 SELECT 语句中有四个人有 
YES 标记 为什么不呢 让我们给所有的这四个人加薪吧 你可以通过运行名字叫 
block2。sql 的脚本来自动为这四个人进行合理的加薪 
输入/输出 
403 
…………………………………………………………Page 404……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪 
SQL》 @block2 
Input truncated to 1 characters 
PL/SQL procedure successfully pleted。 
你可以作一个快速的检查也确定对于每个人的薪金的增加比率是多少 
输入 
SQL》 select * from pay_table order by pay_type; pay_rate desc 
输出 
NAME PAY_TYPE PAY_RATE EFF_DATE PREV_PAY 
SANDRA SAMUELS HOURLY 12。50 01…JAN…97 
ROBERT BOBAY HOURLY 11。96 20…MAY…97 11。5 
KEITH JONES HOURLY 10。40 20…MAY…97 10 
SUSAN WILLIAMS HOURLY 9。75 01…MAY…97 
CHRISSY ZOES SALARY 50000。00 01…JAN…97 
CLODE EVANS SALARY 42150。00 01…MAR…97 
JOHN SMITH SALARY 36750。00 20…MAY…97 35000 
KEVIN TROLLBERG SALARY 28875。00 20…MAY…97 27500 
分析 
四个雇员的薪金已经增加了 如果将现在的输出和原来的 SELECT 的输出做比较的话 
你会发现相应的改变 当前的薪金率的变化反映和薪金的增加 原有的薪金率被插入到了 
PREV_PAY 列中 而有效日期则被更新为当前的日期 没有符合资格的人的情况则没有任 
何变化 
请等一下 我们没有看到定义的异常工作的机会 你可以向 PAY_TABLE 表中插入一 
个不合法的记录来对异常部分进行检测 
输入 
SQL》 insert into pay_table values 
2 ("JEFF JENNINGS";"WEEKLY";71。50;"01…JAN…97";NULL); 
输出 
1 row created。 
输入/输出 
SQL》 @block2 
404 
…………………………………………………………Page 405……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪 
小说推荐
返回首页返回目录