项目10 实施图书借阅网站项目的PL SQL开发
10.3 任务2——PL/SQL基础
--- 10.3.1 块结构 ---
-- 例10.1 --
SET ServerOutput ON;
DECLARE
var_dividend number;
var_divisor number;
var_quotient number;
BEGIN
var_dividend:=6;
var_divisor:=0;
var_quotient:=var_dividend/var_divisor;
dbms_output.put_line('var_divisor='||var_divisor);
EXCEPTION
When ZERO_DIVIDE then
dbms_output.put_line('除数为零');
END;
/
-- 计算两个数的商,如果除数是零,则异常处理,提示“除数为零”。 --
--- 10.3.4 变量与常量 ---
-- 例10.2 --
DECLARE
var1 number(2);
var2 number(3) not null:=111;
var3 CONSTANT number(4)DEFAULT 300;
BEGIN
var1:=12;
DBMS_OUTPUT.PUT_LINE(var1);
DBMS_OUTPUT.PUT_LINE(var2);
DBMS_OUTPUT.PUT_LINE(var3);
END;
/
-- 声明变量与常量部分 --
-- 例10.3 --
SET SERVEROUTPUT ON;
DECLARE
VAR_NAME USERS.NAME% TYPE;
VAR_USERS USERS% ROWTYPE;
BEGIN
SELECT NAME INTO VAR_NAME FROM USERS WHERE ID=2;
SELECT * INTO VAR_USERS FROM USERS WHERE ID=2;
DBMS_OUTPUT.PUT_LINE(VAR_NAME);
DBMS_OUTPUT.PUT_LINE(VAR_USERS.NAME);
END;
/
-- 定义变量VAR_NAME与USERS中的NAME字段的类型一样,定义变量VAR_USERS与USERS表结构一致,并输出显示编号为2的管理员姓名 --
--- 10.3.5 流程控制 ---
--- 1.选择结构 ---
-- 例10.4 --
SET ServerOutput ON;
DECLARE
NUM INTEGER;
BEGIN
SELECT EXTRACT(YEAR FROM SYSDATE)-EXTRACT(YEAR FROM PUBLISHDATE) INTO NUM FROM BOOK WHERE ISBN ='9787730224478';
IF NUM <= 1 THEN
DBMS_OUTPUT.PUT_LINE('新书');
ELSIF NUM <= 10 THEN
DBMS_OUTPUT.PUT_LINE('借阅书');
ELSE
DBMS_OUTPUT.PUT_LINE('馆藏书');
END IF;
END;
/
-- 使用IF语句判读一本书的出版时长 --
-- 例10.5 --
SET ServerOutput ON;
DECLARE
varDAY INTEGER:=7;
Result VARCHAR2(20);
BEGIN
Result:=CASE varDAY
WHEN 1 THEN'星期一'
WHEN 2 THEN'星期二'
WHEN 3 THEN'星期三'
WHEN 4 THEN'星期四'
WHEN 5 THEN'星期五'
WHEN 6 THEN'星期六'
WHEN 7 THEN'星期日'
ELSE '数据越界'
END;
dbms_output.put_line(Result);
END;
/
-- 使用CASE语句根据给定的整数输出对应的星期值 --
--- 2.循环结构 ---
-- 例10.6 --
SET ServerOutput ON;
DECLARE
v_Num INTEGER:=1;
v_Sum INTEGER:=0;
BEGIN
LOOP
v_Sum:=v_Sum + v_Num;
IF v_Num = 10 THEN
EXIT;
END IF;
v_Num:=v_Num + 1;
END LOOP;
dbms_output.put_line(v_Sum);
END;
/
-- 使用LOOP……EXIT……END语句计算1~10的和 --
-- 例10.7 --
SET ServerOutput ON;
DECLARE
v_Num INTEGER:=1;
v_Sum INTEGER:=0;
BEGIN
LOOP
v_Sum:=v_Sum + v_Num;
EXIT WHEN v_Num = 100;
v_Num:=v_Num + 1;
END LOOP;
dbms_output.put_line(v_Sum);
END;
/
-- 用LOOP……EXIT WHEN……END语句来实现1~100的求和 --
-- 例10.8 --
SET ServerOutput ON;
DECLARE
v_Num INTEGER:=1;
v_Sum INTEGER:=0;
BEGIN
WHILE v_Num <= 100
LOOP
v_Sum:=v_Sum + v_Num;
IF v_Num >100 THEN
EXIT;
END IF;
v_Num:=v_Num + 1;
END LOOP;
dbms_output.put_line(v_Sum);
END;
/
-- 用WHILE……LOOP……END LOOP语句来实现1~100的求和 --
-- 例10.9 --
SET ServerOutput ON;
DECLARE
v_Num INTEGER;
v_Sum INTEGER:=0;
BEGIN
FOR v_Num IN 1..100
LOOP
v_Sum:=v_Sum + v_Num;
IF v_Num >100 THEN
EXIT;
END IF;
END LOOP;
dbms_output.put_line(v_Sum);
END;
/
-- 用FOR……IN……LOOP……END LOOP语句来实现1~100的求和 --
10.4 任务3——异常处理
-- 例10.10 --
DECLARE
x NUMBER;
BEGIN
x:='aa';
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('数据类型错误');
END;
/
-- 数据类型错误导致的异常处理 --
-- 例10.11 --
SET SERVEROUTPUT ON;
DECLARE
var_Name VARCHAR(40);
BEGIN
SELECT Name INTO var_Name
FROM USERS WHERE Type = 3;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有数据');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('返回多行匹配的数据');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('未知错误');
END;
/
-- 从表USERS中读取用户类型编号为3的用户名,并赋值到变量var_Name中 --
10.5 任务4——常用函数
--- 10.5.1 数值型函数 ---
--- 1.绝对值函数 ---
-- 例10.12 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(ABS(-8));
END;
/
-- 计算-8的绝对值 --
--- 2.CEIL函数 ---
-- 例10.13 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(CEIL(123.45));
dbms_output.put_line(CEIL(-123.45));
dbms_output.put_line(CEIL(0));
END;
/
-- 分别对正数、负数和0计算CEIL --
--- 3.FLOOR函数 ---
-- 例10.14 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(FLOOR(123.45));
dbms_output.put_line(FLOOR(-123.45));
dbms_output.put_line(FLOOR(0));
END;
/
-- 分别对正数、负数和0计算FLOOR --
--- 4.POWER函数 ---
-- 例10.15 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(POWER(10,2));
END;
/
-- 计算10的平方 --
--- 5.ROUND函数 ---
-- 例10.16 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(ROUND(123.456,2));
dbms_output.put_line(ROUND(123.456,1));
dbms_output.put_line(ROUND(123.456,0));
dbms_output.put_line(ROUND(123.456,-1));
dbms_output.put_line(ROUND(123.456,-2));
dbms_output.put_line(ROUND(123.456,-3));
END;
/
-- ROUND函数返回数字表达式并四舍五入为指定的长度或精度 --
--- 6.TRUNC函数 ---
-- 例10.17 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(TRUNC(89.985,2));
dbms_output.put_line(TRUNC(89.985));
dbms_output.put_line(TRUNC(89.985,-1));
END;
/
-- TRUNC函数不对指定小数前或后的部分做相应舍入选择处理,统统截去 --
--- 10.5.2 字符型函数 ---
-- 例10.18 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(ASCII('ABC'));
END;
/
-- 输出字符A的ASCII码 --
--- 2.LENGTH函数 ---
-- 例10.19 --
SELECT NAME,LENGTH(NAME) FROM USERS
WHERE Type = 3;
-- 返回部门名称的字符串长度 --
--- 3.UPPER函数 ---
-- 例10.20 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(UPPER('abc'));
END;
/
-- 将字符串'abc'转换为大写字母 --
--- 10.5.3 日期型函数 ---
--- 1.SYSDATE函数 ---
-- 例10.21 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(SYSDATE);
END;
/
-- 输出当前的日期信息 --
--- 2.TO_CHAR函数 ---
-- 例10.22 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(TO_CHAR(SYSDATE));
END;
/
-- 将当前日期转换为字符串后再输出 --
--- 3.LAST_DAY函数 ---
-- 例10.23 --
SET ServerOutput ON;
BEGIN
dbms_output.put_line(LAST_DAY(SYSDATE));
END;
/
-- 输出当前月份的最后一天 --