这一章的练习使用,那个scott下的emp表进行。
先使用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......');这就是永久都不会执行了,所以在创建过程的时候,报警告。