友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第70部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
GGG PaidinFull
HHH PaidinFull
ABC StillOwes 60。49
DDD StillOwes 150。95
BBB StillOwes 50。00
分析
从 PAYMENT_TABLE 获得的数据中有一行被插入到了 PAY_STATUS_TABLE 表中
如果用户的付款金额比应付金额更多 那么差额将会被输入到 AMT_CREDIT 列中 如果
用户的支付金额少于应付金额 那么将会在 AMT_OWED 中输入一个信息 如果客户已经
全部支付完毕 那么这两列中就不会有任何数据
又一个程序
在这个例子中使用的表叫 PAY_TABLE
输入
SQL》 desc pay_table
输出
Name Null? Type
NAME NOT NULL VARCHAR2(20)
PAY_TYPE NOT NULL VARCHAR2(8)
PAY_RATE NOT NULL NUMBER(8;2)
EFF_DATE NOT NULL DATE
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) 翻译人 笨猪
Input truncated to 1 characters
=======================
ERROR: Aborting program。
Unknown Pay Type for: JEFF JENNINGS
PL/SQL procedure successfully pleted。
分析
错误信息表明 JEFF JENNINGS 的薪金支付方式不是 HOURLY 和 SALARY 这就是异
常所捕获到的错误信息
存储过程 包和触发机制
使用 PL/SQL 你可以创建存储对象来代替日复一日的输入单调和枯燥的代码 过程
是一些可以执行一些特定类型的存储工作的代码块 相关的过程可以组合和存储在一起
这称为包 触发机制是一种在其它的事务中使用的数据库对象 你也许对一个叫 ORDERS
的表建立了一个触发机制以使得每次当 ORDERS 表接受到数据时都向 HISTORY 表中插入
数据 这些对象的基本语法如下
过程示例
语法
PROCEDURE procedure_name IS
variable1 datatype;
。。。
BEGIN
statement1;
。。。
EXCEPTION
when 。。。
END procedure_name;
405
…………………………………………………………Page 406……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
示例包
语法
CREATE PACKAGE package_name AS
PROCEDURE procedure1 (global_variable1 datatype; 。。。);
PROCEDURE procedure2 (global_variable1 datatype; 。。。);
END package_name;
CREATE PACKAGE BODY package_name AS
PROCEDURE procedure1 (global_variable1 datatype; 。。。) IS
BEGIN
statement1;
。。。
END procedure1;
PROCEDURE procedure2 (global_variable1 datatype; 。。。) IS
BEGIN
statement1;
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!