--IF条件语句
--在PL/SQL块中,IF条件语句可以包含IF、ELSIF、ELSE、THEN和END IF等关键字,通过如下的案例来加深理解
SET SERVEROUTPUT ON;
DECLARE
score BINARY_INTEGER:=61;
BEGIN
IF score>=90 THEN
DBMS_OUTPUT.PUT_LINE('优秀!');
ELSIF score>=80 THEN
DBMS_OUTPUT.PUT_LINE('良好!');
ELSIF score>=80 THEN
DBMS_OUTPUT.PUT_LINE('及格!');
ELSE
DBMS_OUTPUT.PUT_LINE('不及格!');
END IF;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--CASE表达式
DECLARE
grade VARCHAR2(4):=&GRADE;
BEGIN
CASE grade
WHEN '优秀' THEN DBMS_OUTPUT.PUT_LINE('大于等于90分');
WHEN '良好' THEN DBMS_OUTPUT.PUT_LINE('大于等于80分,小于90分');
WHEN '及格' THEN DBMS_OUTPUT.PUT_LINE('大于等于60分,小于80分');
WHEN '不及格' THEN DBMS_OUTPUT.PUT_LINE('小于60分');
ELSE DBMS_OUTPUT.PUT_LINE('输入有误,请重新输入!!');
END CASE;
--LOOP循环语句
DECLARE
i BINARY_INTEGER:=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
EXIT WHEN i>10;
END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--WHILE循环语句
DECLARE
i BINARY_INTEGER:=1;
BEGIN
WHILE i<10
LOOP
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--FOR循环语句
BEGIN
FOR i IN 1..10
LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--游标
--使用SELECT语句可以返回一个结果集,但要对结果集中单独的进行操作,那么就需要使用游标。
--使用游标分为四个步骤:声明游标-打开游标-检索游标-关闭游标
SET SERVEROUTPUT ON;
DECLARE
CURSOR cursor_emp(v_deptno NUMBER) --声明一个游标
IS
SELECT empno,ename,job,sal
FROM emp WHERE deptno=v_deptno;
TYPE emp_type IS RECORD( --声明一个记录类型
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(9),
sal NUMBER(7,2)
);
one_emp emp_type; --定义一个记录类型变量
BEGIN
OPEN cursor_emp(30); --打开游标
LOOP --开始LOOP循环
FETCH cursor_emp INTO one_emp; --检索游标
EXIT WHEN cursor_emp%NOTFOUND; --当游标没有返回结果时退出循环
DBMS_OUTPUT.PUT_LINE('当前检索第'|| --在控制台输出
cursor_emp%ROWCOUNT||'行:'|| --返回记录数
one_emp.empno||' '|| --打印出雇员号
one_emp.ename||' '|| --打印出雇员姓名
one_emp.job||' '|| --打印出雇员的职位
one_emp.sal); --打印出雇员的薪水
END LOOP;
CLOSE cursor_emp;
--使用for循环控制游标的循环时,不能对游标进行OPEN、FETCH、CLOSE操作。
--游标的输入参数只能用默认的初始化参数
DECLARE
CURSOR cursor_emp(v_deptno NUMBER:=20) --声明一个游标
IS
SELECT empno,ename,job,sal
FROM emp WHERE deptno=v_deptno;
BEGIN
FOR one_emp IN cursor_emp
LOOP --开始LOOP循环
DBMS_OUTPUT.PUT_LINE('当前检索第'|| --在控制台输出
cursor_emp%ROWCOUNT||'行:'|| --返回记录数
one_emp.empno||' '|| --打印出雇员号
one_emp.ename||' '|| --打印出雇员姓名
one_emp.job||' '|| --打印出雇员的职位
one_emp.sal); --打印出雇员的薪水
END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--异常
--导致PL/SQL块异常的原因有很多,例如程序本身出现的逻辑错误,或者程序员根据业务需要,自定义的异常错误等。
--产生异常时,如果不处理,那么程序就会停止执行
--如下为异常处理的语法:
EXCEPTION
WHEN exception1 THEN
statements1;
WHEN exception2 THEN
statements2;
[...]
WHEN OTHERS THEN
statementsn;
/*
这里列出一些常见的异常
NO_DATA_FOUND 数据不存在
CASE_NOT_FOUND CASE语句未找到匹配的WHEN子句,也没有默认的ELSE子句
INVALID_CURSOR 非法的游标操作,例如关闭未打开的游标
STORAGE_ERROE 内存出错,或已经用完
VALUE_ERROR 发生算术、转换、截断或大小约束错误
ZERO_DIVIDE 试图将0作为除数
*/
DECLARE
V_ENAME VARCHAR2(20);
V_SAL
NUMBER(7,2);
BEGIN
SELECT ENAME,SAL INTO V_ENAME,V_SAL FROM SCOTT.EMP WHERE EMPNO=&NO;
DBMS_OUTPUT.PUT_LINE('用户名:'||V_ENAME||'
月薪:'||V_SAL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('输入雇员编号有误,请重新输入!');
END;
--在PL/SQL块中,IF条件语句可以包含IF、ELSIF、ELSE、THEN和END IF等关键字,通过如下的案例来加深理解
SET SERVEROUTPUT ON;
DECLARE
score BINARY_INTEGER:=61;
BEGIN
IF score>=90 THEN
DBMS_OUTPUT.PUT_LINE('优秀!');
ELSIF score>=80 THEN
DBMS_OUTPUT.PUT_LINE('良好!');
ELSIF score>=80 THEN
DBMS_OUTPUT.PUT_LINE('及格!');
ELSE
DBMS_OUTPUT.PUT_LINE('不及格!');
END IF;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--CASE表达式
DECLARE
grade VARCHAR2(4):=&GRADE;
BEGIN
CASE grade
WHEN '优秀' THEN DBMS_OUTPUT.PUT_LINE('大于等于90分');
WHEN '良好' THEN DBMS_OUTPUT.PUT_LINE('大于等于80分,小于90分');
WHEN '及格' THEN DBMS_OUTPUT.PUT_LINE('大于等于60分,小于80分');
WHEN '不及格' THEN DBMS_OUTPUT.PUT_LINE('小于60分');
ELSE DBMS_OUTPUT.PUT_LINE('输入有误,请重新输入!!');
END CASE;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--循环语句--LOOP循环语句
DECLARE
i BINARY_INTEGER:=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
EXIT WHEN i>10;
END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--WHILE循环语句
DECLARE
i BINARY_INTEGER:=1;
BEGIN
WHILE i<10
LOOP
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--FOR循环语句
BEGIN
FOR i IN 1..10
LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--游标
--使用SELECT语句可以返回一个结果集,但要对结果集中单独的进行操作,那么就需要使用游标。
--使用游标分为四个步骤:声明游标-打开游标-检索游标-关闭游标
SET SERVEROUTPUT ON;
DECLARE
CURSOR cursor_emp(v_deptno NUMBER) --声明一个游标
IS
SELECT empno,ename,job,sal
FROM emp WHERE deptno=v_deptno;
TYPE emp_type IS RECORD( --声明一个记录类型
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(9),
sal NUMBER(7,2)
);
one_emp emp_type; --定义一个记录类型变量
BEGIN
OPEN cursor_emp(30); --打开游标
LOOP --开始LOOP循环
FETCH cursor_emp INTO one_emp; --检索游标
EXIT WHEN cursor_emp%NOTFOUND; --当游标没有返回结果时退出循环
DBMS_OUTPUT.PUT_LINE('当前检索第'|| --在控制台输出
cursor_emp%ROWCOUNT||'行:'|| --返回记录数
one_emp.empno||' '|| --打印出雇员号
one_emp.ename||' '|| --打印出雇员姓名
one_emp.job||' '|| --打印出雇员的职位
one_emp.sal); --打印出雇员的薪水
END LOOP;
CLOSE cursor_emp;
END;
--使用for循环控制游标的循环时,不能对游标进行OPEN、FETCH、CLOSE操作。
--游标的输入参数只能用默认的初始化参数
DECLARE
CURSOR cursor_emp(v_deptno NUMBER:=20) --声明一个游标
IS
SELECT empno,ename,job,sal
FROM emp WHERE deptno=v_deptno;
BEGIN
FOR one_emp IN cursor_emp
LOOP --开始LOOP循环
DBMS_OUTPUT.PUT_LINE('当前检索第'|| --在控制台输出
cursor_emp%ROWCOUNT||'行:'|| --返回记录数
one_emp.empno||' '|| --打印出雇员号
one_emp.ename||' '|| --打印出雇员姓名
one_emp.job||' '|| --打印出雇员的职位
one_emp.sal); --打印出雇员的薪水
END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--异常
--导致PL/SQL块异常的原因有很多,例如程序本身出现的逻辑错误,或者程序员根据业务需要,自定义的异常错误等。
--产生异常时,如果不处理,那么程序就会停止执行
--如下为异常处理的语法:
EXCEPTION
WHEN exception1 THEN
statements1;
WHEN exception2 THEN
statements2;
[...]
WHEN OTHERS THEN
statementsn;
/*
这里列出一些常见的异常
NO_DATA_FOUND 数据不存在
CASE_NOT_FOUND CASE语句未找到匹配的WHEN子句,也没有默认的ELSE子句
INVALID_CURSOR 非法的游标操作,例如关闭未打开的游标
STORAGE_ERROE 内存出错,或已经用完
VALUE_ERROR 发生算术、转换、截断或大小约束错误
ZERO_DIVIDE 试图将0作为除数
*/
DECLARE
V_ENAME VARCHAR2(20);
V_SAL
NUMBER(7,2);
BEGIN
SELECT ENAME,SAL INTO V_ENAME,V_SAL FROM SCOTT.EMP WHERE EMPNO=&NO;
DBMS_OUTPUT.PUT_LINE('用户名:'||V_ENAME||'
月薪:'||V_SAL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('输入雇员编号有误,请重新输入!');
END;