PL/SQL编程进阶篇

--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;

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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值