项目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;
/
-- 输出当前月份的最后一天 --
署名-非商业性使用-禁止演绎 4.0 国际 协议(CC BY-NC-ND 4.0)
最后修改:2022 年 12 月 23 日
如果觉得我的文章对你有帮助,可以点个赞再走喔