oracle/PL/SQL编程(3)

一、PL/SQL的概念

  PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。

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

二、PL/SQL的结构写法

    程序块:
    DECLARE -- (可选语句块)申明块,用于申明变量、常量、异常、游标
    BEGIN -- (必选)执行语句块开始
    EXCEPTION -- (可选)异常捕获语句块
    END;  -- (必选)执行语句块结束

三、变量的定义、赋值符、输入符和打印输出

 

  DECLARE

    a NUMBER; -- 定义一个数值类型的变量a

    b VARCHAR(20) DEFAULT '字符串'; -- 定义一个字符类型的变量,赋初始值为'字符串'

    c NUMBER; -- 定义一个数值类型的变量c

  BEGIN

    a := 10; -- 赋值符':=' 赋值为10

    c := '&请输入...'; -- 从键盘输入,赋值给c

    dbms_output.put(a); -- 打印输出语句

    dbms_output.put_line(b); -- 打印输出语句换行

    dbms_output.put_line(c); -- 打印输出语句换行

  END;

  特殊类型和特殊赋值

  ❶字段类型:“%type”指定和表字段的类型一样

    例:定义:ename emp.ename%type;

      赋值:SELECT emp.ename INTO ename FROM emp WHERE emp.empno = 7788;

  ❷行类型:“%rowtype”指定和表的一行字段一样

    例:定义:row emp%rowtype;

      赋值:SELECT emp.* INTO row FROM emp;

四、顺序结构、条件结构和循环结构

  (1)顺序结构

    ❶ 程序正常执行是顺序执行

    ❷ 可以使用“goto”关健字跳至“<<>>”标记点执行

    例:

      BEGIN
        GOTO cod1;
        dbms_output.put_line('这一行被跳过');
        <<cod1>>
        dbms_output.put_line('被执行');
      END;

 

  (2)条件结构

    ❶IF:

      IF .. THEN

        执行的代码。。。

      ELSIF .. THEN

        执行的代码。。。

      ELSE

        执行的代码。。。

      END IF;

    ❷CASE(类似于Java中的switch):

      CASE 变量

      WHREN 对应的值 THEN

        执行的代码。。。

      WHREN 对应的值 THEN

        执行的代码。。。、

      ELSE 

        其他。。。。

      END CASE;

  (3)循环结构

    ❶loop ... end loop

    ❷while 表达式 loop ... end loop;

    ❸for 变量名 in 数字..数字 loop ... end loop;

 

 

五、预定义异常、自定义异常和嵌套异常

  (1)预定义异常

    BEGIN
      dbms_output.put_line(6/&input); -- 输出6除以输入的数
      EXCEPTION -- 定义捕捉异常
        WHEN zero_divide THEN -- 当zero_divide异常发生的时候
          dbms_output.put_line('异常发生了,除数不能为零'); -- 打印输出
     END;

   (2)自定义异常   

     DECLARE
      myExcp EXCEPTION; -- 定义一个异常
      sname VARCHAR(20);
     BEGIN
      sname := '&请输入名字';
      IF sname = '西门庆' THEN -- 如果sname的值等于西门庆
       RAISE myExcp; -- 抛出异常
      END IF; -- 结束IF
      dbms_output.put_line(sname);
      EXCEPTION -- 捕捉异常
       WHEN myExcp THEN -- 当myExcp异常发生的时候
        dbms_output.put_line('西门庆是个BUG'); -- 打印输出
     END;

    (3)嵌套异常

      DECLARE
        eno NUMBER;
        ename emp.ename%TYPE;
      BEGIN
        eno := &input;
        -- dbms_output.put_line(6/&input); -- 输出6除以输入的数
        SELECT emp.ename INTO ename FROM emp WHERE empno = eno;
        dbms_output.put_line(ename);
        EXCEPTION -- 定义捕捉异常
          WHEN zero_divide THEN -- 当zero_divide异常发生的时候
            dbms_output.put_line('异常发生了,除数不能为零'); -- 打印输出
          WHEN no_data_found THEN ---- 当no_data_found异常发生的时候
            dbms_output.put_line('找不到数据');

          WHEN OTHERS THEN -- others 概括了所有的预定义异常

            dbms_output.put_line('error');

       END;

六、动态执行(execute immediate)

  (1)动态执行可执行里面的字符

  BEGIN
   EXECUTE IMMEDIATE
   'CREATE TABLE test2(n NUMBER)'; -- 字符
  END;

 

posted on 2018-02-10 15:52  都是妖怪吧  阅读(140)  评论(0)    收藏  举报

导航