按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
PREV_PAY NUMBER(8;2)
先来看一下数据
400
…………………………………………………………Page 401……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输入
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。50 15…MAY…96
KEITH JONES HOURLY 10。00 31…OCT…96
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 35000。00 15…JUN…96
KEVIN TROLLBERG SALARY 27500。00 15…JUN…96
现实情况 由于销售情况很好 你需要给为你工作的时间超过了六个月的个人增加薪
金 符合条件的钟点工的薪金增加 4% 而符全条件的雇员的薪金需要增加 5%
今天的日期是
输入/输出
SQL》 select sysdate from dual
SYSDATE
20…MAY…97
在对下边的 PL/SQL 语句块进行检查之前 我们要对 PAY_TABLE 表进行手工的选择
以找出都有哪些人需要增加薪金
输入
SQL》 select name; pay_type; pay_rate; eff_date;
2 'YES' due
3 from pay_table
4 where eff_date 《 sysdate 180
5 UNION ALL
6 select name; pay_type; pay_rate; eff_date;
7 'No' due
8 from pay_table
9 where eff_date 》= sysdate 180
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)