美文网首页
PL/SQL入门使用详解

PL/SQL入门使用详解

作者: moutory | 来源:发表于2021-03-10 16:04 被阅读0次

    前言

    PL/SQL是Oracle数据库对SQL语句的扩展,可以让我们实现ifelse等逻辑判断、for循环执行等功能加入到SQL逻辑的执行过程中,很大程度上提高了SQL的灵活性,也能让我们更好的处理日常工作中遇到的一些复杂的业务场景。本文将对PL/SQL语言的基本语法和使用进行简要的讲解,希望能够对各位读者有所帮助。

    一、PL/SQL简介

    PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算

    二、PL/SQL语法介绍

    1、PL/SQL的总体书写格式
    [declare]
       --声明变量
    begin
       -- 程序体
    [exception]
       --例外;异常
    end;
    --declare和exception部分可以没有,但是begin部分和end必须要有。
    

    其中declareexception为可选模块,作用分别是申明变量和异常处理,beginend为必要模块,我们一般在begin模块中写入我们的具体代码语句,end用于标识语句已经结束。

    入门小案例
    案例输出结果
    (二)变量的定义

    有些读者可能已经注意到,在上面的例子中我们定义了一个变量i,并在后面的语句中使用了这个变量。在
    PL/SQL中可使用标识符来声明变量、常量、游标、用户定义的异常等,并在SQL语句或过程化的语句中使用。
    那么变量的定义格式是怎么样的呢?
    变量名称 变量类型 [NOT NULL] [:= |DEFAULT expr] ;
    其中:=为赋值符号,后面接着具体要赋的值。使用NOT NULL约束条件定义变量时,必须为变量赋予一个值。
    变量的类型分解类型可以分为如下三类:

    变量分类 变量类型
    标量类型 数字、字符、布尔、日期时间
    LOB类型 BFILE、BLOB、CLOB、NCLOB
    属性类型 %TYPE、%ROWTYPE

    其中,标量类型只能存储单值、内部没有分量(即非对象类型),像数值、字符、日期等就都属于是标量类型;
    LOB类型表示大型的对象;
    属性类型看起来似乎有点抽象,其实它相当于是一种逻辑的抽象,比如%TYPE可以用来表示表中的字段属性,%ROWTYPE可以表示表中的数据行,我们把这些属性抽象成一个对象来使用,可以减少我们在实际写代码的工作量。

    下面我们来用属性类型的变量来写一个小例子:

    %TYPE演示用例
    在这个案例中我们想要打印出员工号为7566的姓名,但是我们并不知道在EMP表中,ENAME的数据类型是什么,我们可以直接使用表名.列名%TYPE的方式来将这个字段的类型赋予给变量名v_name。并在执行查询语句时,使用into关键字将查询到的字符赋值给变量v_name,最后实现变量的输出。
    同理,%ROWTYPE的使用也十分的方便,再看一下下面这个小例子
    %ROWTYPE演示用例
    %ROWTYPE演示结果

    我们把v_row的数据类型定义为ROWTYPE,表示一行数据,在查询过程中将查询到的数据用into关键字赋值给我们的行变量。最后使用行变量.字段名称的方式输出对应的结果

    (三)控制语句结构之条件控制
    1、 条件语句IF
    IF <布尔表达式> THEN
      PL/SQL 和 SQL语句
    ELSIF < 其它布尔表达式> THEN
      其它语句
    ELSIF < 其它布尔表达式> THEN
      其它语句
    ELSE
      其它语句
    END IF;
    

    演示用例:

    declare
     i int := dbms_random.value(0,10);
    begin
      if i<4 then
        dbms_output.put_line('num is less then 4');
      elsif i<6 then
        dbms_output.put_line('num is less then 6');
      else
        dbms_output.put_line('num is more then or eq  6');
      end if;
      
    end;
    

    这里需要记住elsif的写法,不要拼写错误了

    2、 条件语句CASE
    CASE 条件表达式
      WHEN 条件表达式结果1 THEN 
         语句段1
      WHEN 条件表达式结果2 THEN
         语句段2
      ......
      WHEN 条件表达式结果n THEN
         语句段n
      [ELSE 条件表达式结果]
    END;
    
    ------------------
    
    CASE 
      WHEN 条件表达式1 THEN
         语句段1
      WHEN 条件表达式2 THEN
         语句段2
      ......
      WHEN 条件表达式n THEN 
         语句段n
      [ELSE 语句段]
    END;
    

    演示用例:

    DECLARE
      V_grade char(1) := UPPER('&p_grade');
      V_appraisal VARCHAR2(20);
    BEGIN
      V_appraisal :=
      CASE v_grade
        WHEN 'A' THEN 'Excellent'
        WHEN 'B' THEN 'Very Good'
        WHEN 'C' THEN 'Good'
        ELSE 'No such grade'
      END;
      DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||'  Appraisal: '|| v_appraisal);
    END;
    
    DECLARE
       v_first_name employees.first_name%TYPE;
       v_job_id employees.job_id%TYPE;
       v_salary employees.salary%TYPE;
       v_sal_raise NUMBER(3,2);
    BEGIN
       SELECT first_name,   job_id,   salary INTO
              v_first_name, v_job_id, v_salary
       FROM employees WHERE employee_id = &emp_id;
       CASE
          WHEN v_job_id = 'PU_CLERK' THEN
             IF v_salary < 3000 THEN v_sal_raise := .08;
             ELSE v_sal_raise := .07;
             END IF;
          WHEN v_job_id = 'SH_CLERK' THEN
             IF v_salary < 4000 THEN v_sal_raise := .06;
             ELSE v_sal_raise := .05;
             END IF;
          WHEN v_job_id = 'ST_CLERK' THEN
             IF v_salary < 3500 THEN v_sal_raise := .04;
             ELSE v_sal_raise := .03;
             END IF;
          ELSE
             DBMS_OUTPUT.PUT_LINE('该岗位不涨工资: '||v_job_id);
       END CASE;
       DBMS_OUTPUT.PUT_LINE(v_first_name||'的岗位是'||v_job_id
                                        ||'、的工资是'||v_salary
                                        ||'、工资涨幅是'||v_sal_raise);
    END;
    

    这里要注意,演示用例在定义变量的时候使用到了&这个符号,这个符号表示该变量的值会在执行过程中由执行者手动输入再确定。

    (四)控制语句结构之循环控制

    PL/SQL中一共有三种循环方式,分别是while、loop和for。下面来讲解一下三种循环方式的使用:


    1. loop循环(类似于java中的do while循环)
    loop
        要执行的语句
    exit when <条件语句>;
    end loop;
    

    演示用例:

    declare
     i int := 1;
    begin
     loop 
       dbms_output.put_line(i);
       i := i+1;
      exit when i>10;
      end loop;
    end;
    

    2. while循环
    while <布尔表达式> loop
        要执行的语句;
    end loop;
    

    演示用例:

    declare
     i int := 1;
    begin
     while i<10 loop
       dbms_output.put_line(i);
       i := i+1;
       end loop;
    end;
    

    3. for循环
    for 循环计数器 in [reverse] 下限..上限 loop
        要执行语句;
    end loop;
    

    演示用例:

    declare
    
    begin
     for i in 1..10 loop
       dbms_output.put_line(i);
       end loop;
    end;
    

    使用for循环的时候,可以不用再前面的declare模块中定义数值变量i,在for中直接使用即可。

    (五)代码块注释

    在PL/SQL中使用--表示单行注释,用/**/表示多行注释

    注释演示用例

    关于PL/SQL基本的入门语法就介绍到这里了,有需要了解更多PL/SQL的高阶用法的读者,可以在参考资料中阅读或者自行百度。

    参考资料:
    PLSQL编程详解 :https://www.jianshu.com/p/3d5acb46936e
    PL/SQL 编程语言 : https://www.cnblogs.com/wlym/p/7455650.html

    相关文章

      网友评论

          本文标题:PL/SQL入门使用详解

          本文链接:https://www.haomeiwen.com/subject/rshwqltx.html