Oracle PL/SQL程序设计 第五版 上册 第四章 条件和顺序控制
这一章的练习使用,那个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;了,这样直接就代表一个可执行语句,但其实是什么也不执行的意思。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。