使用: 定义PL/SQL语句块 --声明部分
DECLARE --定义变量
qty_on_hand number(5); --可执行部分
BEGIN --PL/SQL语句
SELECT quantity INTO qty_on_hand
FROM Products
WHERE product = '芭比娃娃'
FOR UPDATE OF quantity;
IF qty_on_hand > 0 THEN
UPDATE Products SET quantity = quantity + 1
WHERE product = '芭比娃娃';
INSERT INTO purchase_record
VALUES ('已购买芭比娃娃', SYSDATE);
END IF;
COMMIT; --异常处理部分
EXCEPTION /* 异常处理语句 */
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出错:'|| SQLERRM);
END;
/
注意:默认情况下,SQL*Plus工具不会显示DBMS_OUTPUT程序包
的输出,要启用DBMS_OUTPUT,须执行命令set serveroutput on ,
语句结束后的"/",表示执行程序块
使用: 从ItemFile表中查询编号为I188的商品价格,存变量iRate中,如果
价格大于200,将价格减少200,价格小于200,将价格减少50,
set serveroutput on
DECLARE
iCode varchar2(4);--商品编号
iRate number;--商品价格
BEGIN --查询编号为I188的商品,将商品编号赋给iCode,
--将价格赋给变量iRate
select itemCode, itemRate into iCode ,iRate
from ItemFile
where itemCode = 'I188'; --根据价格范围进行更新操作
IF iRate > 200 THEN
update ItemFile set itemRate = itemRate - 200
where itemCode = iCode;
ELSE
update ItemFile set itemRate = itemRate - 50
where itemCode = iCode;
END IF; --输出信息
DBMS_OUTPUT.PUT_LINE('编号:' || iCode || ' 价格:' || iRate);
END;
/
if-then-elsif语句:
将附加条件语句与if-then-else语句相结合的一种形式,语法为,
IF condition1 THEN
语句1;
ELSIF condition2 THEN
语句2;
ELSIF condition3 THEN
语句3;
...
ELSE
语句4;
END IF;
11.2)分支控制,case语句
将单个变量或表达式与多个值进行比较,执行 CASE 语句前先计算
选择器(selector)的值,当selector的值与WHEN中的表达式相等时,
执行THEN部分的语句,语法:
CASE selector
WHEN 表达式1 THEN 语句1;
WHEN 表达式1 THEN 语句1;
...
WHEN 表达式N THEN 语句N;
[ELSE 语句;]--当以上条件都不满足时执行ELSE中语句
END CASE;
使用: 提示用户输入成绩值,根据成绩输出相应的等级,
set serveroutput on
BEGIN
CASE '&score' --接收输入的成绩
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优异');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('优秀');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('一般');
WHEN 'E' THEN DBMS_OUTPUT.PUT_LINE('较差');
ELSE DBMS_OUTPUT.PUT_LINE('没有此成绩!');
END CASE;
END;
/
12、循环控制
异常处理程序语法为:
BEGIN
...
EXCEPTION
WHEN 异常名 THEN
语句;
WHEN OTHERS THEN
语句;
END;
说明:
OTHERS 处理程序确保不会遗漏任何异常,PL/SQL块只能有一个
OTHERS异常处理程序,函数SQLCODE和SQLERRM可返回错误代码和错误文本信息
使用: 检测代码中的预定义错误,
set serveroutput on
DECLARE
orderNum varchar2(5); --订单号
BEGIN --查询订单号
select orderNo into orderNum from orderMaster; --异常处理
EXCEPTION
WHEN TOO_MANY_ROWS THEN --输出提示信息
DBMS_OUTPUT.PUT_LINE('返回多行');
END;
/ 注意:select into只允许返回一行,所以会引发TOO_MANY_ROWS预定义异常
使用: 用自定义异常处理错误,如用户输入'附件', '顶盖', '备件',
属于错误的类别,引发自定义异常,
set serveroutput on
DECLARE --自定义异常(无效类别)
InvalidCategory EXCEPTION;
category varchar2(10);
BEGIN --接收输入的数据
category := '&Category'; --判断输入数据
IF category NOT IN ('附件', '顶盖', '备件') THEN --引发自定义异常
RAISE InvalidCategory;
ELSE --输出信息
DBMS_OUTPUT.PUT_LINE('你输入的类别是:' || category);
END IF; --异常处理块
EXCEPTION --捕获InvalidCategory异常
WHEN InvalidCategory THEN
DBMS_OUTPUT.PUT_LINE('无法识别该类别');
END;
/
使用: 如果费率是未知的,将显示"未指定费率",
set serveroutput on
DECLARE
rate ItemFile.itemRate%TYPE; --自定义异常
RateException EXCEPTION;
BEGIN --查询编号为'I188'的商品的费率,赋给变量rate,费率为NULL就赋0
select NVL(itemRate, 0) into rate from ItemFile
where itemCode = 'I188'; --判断费率
IF rate = 0 THEN --费率为0,引发异常
RAISE RateException;
ELSE --费率不为0,显示费率
DBMS_OUTPUT.PUT_LINE('费率为:' || rate);
END IF; --异常处理块
EXCEPTION
WHEN RateException THEN --显示指定的异常编号和异常信息
RAISE_APPLICATION_ERROR(-20008, '该商品未指定费率');
END;
/