Oracle PL/SQL程序设计 第五版 上册 第四章 条件和顺序控制

这一章的练习使用,那个scott下的emp表进行。

  1. 先使用IF / END IF;

if.sql
CREATE OR REPLACE PROCEDURE get_sal(emp_no_in IN NUMBER)
    AUTHID CURRENT_USER
IS
    l_sal NUMBER;
BEGIN
    SELECT sal INTO l_sal
    FROM emp
    WHERE empno = emp_no_in;
    IF l_sal > 2000
    THEN
        DBMS_OUTPUT.PUT_LINE('OK');
    ELSE
        DBMS_OUTPUT.PUT_LINE('POOR');
    END IF;
END;
/

执行的是这样的:

main.sql
BEGIN
    get_sal(7521);
END;
/

然后就是最全的,加上ELSIF的

if.sql
CREATE OR REPLACE PROCEDURE get_sal(emp_no_in IN NUMBER)
    AUTHID CURRENT_USER
IS
    l_sal NUMBER;
BEGIN
    SELECT sal INTO l_sal
    FROM emp
    WHERE empno = emp_no_in;
    IF l_sal BETWEEN 2000 AND 3000
    THEN
        DBMS_OUTPUT.PUT_LINE('OK');
    ELSIF l_sal > 3000
    THEN
        DBMS_OUTPUT.PUT_LINE('GOD');
    ELSE
        DBMS_OUTPUT.PUT_LINE('POOR');
    END IF;
END;
/

这里我当时出了一个错误,写了ELSIF后,下面没有写THEN,就报错了。


2. 下面就来case了,继续写一个简单的例子

case.sql
CREATE OR REPLACE PROCEDURE case_demo(emp_no_in IN NUMBER)
    AUTHID CURRENT_USER
IS
    l_job VARCHAR2(9);
BEGIN
    SELECT job INTO l_job
    FROM emp
    WHERE empno = emp_no_in;
    CASE l_job
    WHEN 'CLERK'
    THEN
        DBMS_OUTPUT.PUT_LINE('CLERK');
    WHEN 'MANAGER'
    THEN 
        DBMS_OUTPUT.PUT_LINE('MANAGER');
    ELSE
        DBMS_OUTPUT.PUT_LINE('SHIT');
    END CASE;
END case_demo;
/

就是简单的查看JOB。

main.sql
BEGIN
    get_sal(7839);
    case_demo(7369);
    case_demo(7782);
END;
/

这个是来执行的代码。

新改过的代码是这样的,并且我不细心遇到了错误,弄了半天,才发现问题。

CREATE OR REPLACE PROCEDURE case_demo(emp_no_in IN NUMBER)
    AUTHID CURRENT_USER
IS
    l_job VARCHAR2(9);
    l_sal NUMBER;
BEGIN
    SELECT sal INTO l_sal
    FROM emp
    WHERE empno = emp_no_in;
    CASE
    WHEN l_sal >= 1000 AND l_sal <= 2000
    THEN
        DBMS_OUTPUT.PUT_LINE('1000->2000');
    WHEN l_sal >= 2000 AND l_sal <= 3000
    THEN
        DBMS_OUTPUT.PUT_LINE('2000->3000');
    WHEN l_sal > 3000
    THEN
        DBMS_OUTPUT.PUT_LINE('>3000');
    ELSE
        DBMS_OUTPUT.PUT_LINE('>3000');
    END CASE;
END case_demo;
/

原本我以为不用写最后那个ELSE的,但是原来不行,如果使用开始那种形式,是可以不用写的,

但是使用CASE TRUE或者直接CASE,就需要最后的ELSE了。

就是这个问题:CASE not found while executing CASE statement


然后提到的就是case表达式了,这个是用END来结束的没有分号也没有CASE,只是用END结束,这是一个表达式,

返回符号的值,并且如果没有匹配的,就返回NULL。

然后我照着写了一个例子:

CREATE OR REPLACE PROCEDURE give_bonus(emp_no_id IN NUMBER, bonus IN NUMBER)
    AUTHID CURRENT_USER
IS
BEGIN
    DBMS_OUTPUT.PUT_LINE(emp_no_id);
    DBMS_OUTPUT.PUT_LINE(bonus);
END give_bonus;
/


之后是这样使用CASE表达式的

DECLARE
    l_sal NUMBER;
BEGIN
    SELECT sal INTO l_sal
    FROM emp
    WHERE empno = 7839;
    DBMS_OUTPUT.PUT_LINE(l_sal);
    give_bonus(7839, 
            CASE
                WHEN l_sal >= 1000 and l_sal <= 2000 THEN 500
                WHEN l_sal >2000 and l_sal <= 3000 THEN 400
                WHEN l_sal > 3000 THEN 200
                END);
END;
/

这样其实它就是一个表达式,然后表达式会得到一个结果。



之后就介绍到了空语句,以前做单片机的时候,我记得就有这么一个东西,我忘了具体是什么了,这里

用的就是NULL;了,这样直接就代表一个可执行语句,但其实是什么也不执行的意思。

写一下例子,这例子中GOTO了,那它下面的就不能执行了,然后就有警告提示。

CREATE OR REPLACE PROCEDURE null_do(emp_no_in IN NUMBER)
    AUTHID CURRENT_USER
IS
    l_sal NUMBER;
BEGIN
    SELECT sal INTO l_sal
    FROM emp
    WHERE empno = emp_no_in;
    IF l_sal < 1000
    THEN
        DBMS_OUTPUT.PUT_LINE('< 1000');
        GOTO end_proc;
        DBMS_OUTPUT.PUT_LINE('I want talk......');
    ELSE
        DBMS_OUTPUT.PUT_LINE('> 1000');
        GOTO end_proc;
        DBMS_OUTPUT.PUT_LINE('I want talk ..... ');
    END IF;
    
<<end_proc>>
NULL;
END null_do;
/

DBMS_OUTPUT.PUT_LINE('I want talk......');这就是永久都不会执行了,所以在创建过程的时候,报警告。



你可能感兴趣的:(Oracle PL/SQL程序设计 第五版 上册 第四章 条件和顺序控制)