ORACALE之ProceldureLanguage

作者: 浩成聊技术 | 来源:发表于2018-04-27 22:52 被阅读2次

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

    PL/SQL功能

    将SQL语句与过程编程语言相结合,完成更为复杂的工作,使用控制,循环,分支等过程技术,支持游标、异常、函数和事务的sql

    PL/SQL基本结构

    DECLARE
       定义部分(可选) --定义常量,变量,复杂数据类型、游标
    BEGIN
       执行部分(必须) --PL/SQL语句和SQL语句
    END
    EXCEPTION
      异常处理部分 
    

    简单的SQL/PL块

    set serveroutput on --打开oracle 输出方法,使运行结果输出至屏幕
    
    beging
       dbms_output.put_line('Hello World')
    end;
    

    PL/SQL块分类

    • 匿名块
    • 命名块
    • 子程序(过程和函数)
    • 触发器

    匿名块

    没有名称的PL/SQL块

    begin
      dbms_output.put_line('hello wrold');
      begin
        dbms_output.put_line('oracle');
      end;
    end;
    

    命名块

    具有指定名称的PL/SQL块,在块前使用<<name>>命名
    可通过goto语句进行跳转,后面会讨论

    <<outer>>
    begin
      dbms_output.put_line('hello wrold');
      <<inner>>
      begin
        dbms_output.put_line('oracle');
      end;--<<inner>>
    end; --<<outer>>
    

    PL/SQL变量

    • 使用原则:先定义再使用

    • 语法: 变量名 数据类型

    • 示列: studame varchar20(15);

    属性声明

    • %Type引用数据库中的数据表的列的属性

    • %RowType 引用数据库中数据表的行的属性

    sstudno studinfo.studno%Type;
    sstudname studinfo.studname%Type;
    

    赋值操作符

    • 使用 := 进行赋值
    declare
      dname studinfo.studno%Type;
      dscore studscoreinfo.studscore%Type;
    begin
      dname:='Yanghaocheng';
      dscore:='88';
      dbms_output.put_line('Name:'||dname||';'||'Score:'||'dscore');
    end;
    
    • 使用into进行赋值
    declare
      sname studinfo.studname%Type;
    begin
      select studname into sname from studinfo
      where studno='20010505001';
      dbms_output.put_line(sname);
    end;
    
    • 使用 & 获取用户输入
    declare
      sname varchar2(20);
      score number(5,1);
    begin
      sname:='&studname';
      score:='&studscore';
      dbms_output.put_line('studname:'||sname||';'||'studscore:'||score);
    end;
    
    picone.png

    条件控制语句

    • IF-THEN语句
    declare
      i int;
    begin
      i:=5;
      if i=5 then
        dbms_output.put_line('i=5');
      end if;
    end;
    
    • IF-THEN-ELSE语句
    declare
      i int;
    begin
      i:=5;
      if i<5 then
        dbms_output.put_line('i<5');
      else
        dbms_output.put_line('i>=5');
      end if;
    end;
    
    • IF-ELSIF-ELSE语句
    declare
      i int;
    begin
      i:=5;
      if i<5 then
        dbms_output.put_line('i<5');
      elsif i>5 then
        dbms_out.put_line('i>5');
      else
        dbms_output.put_line('i=5');
      end if;
    end;
    

    CASE比较选择

    case <变量>
      when <值1>/<逻辑表达式1> then 结果1;
      when <值2>/<逻辑表达式2> then 结果2;
      .
      .
      .
      when <值n>/<逻辑表达式3> then 结果n;
      else 
    end case ;
    
    • 单一选择等值比较
    declare
      n int;
    begin
      n:=&n;
      case n
        when 2 then
            dbms_output.put_line('恭喜你获得 一等奖');
        when 9 then
            dbms_output.put_line('恭喜你获得 二等奖');
        when 6 then
            dbms_output.put_line('恭喜你获得 三等奖');
        else
            dbms_output.put_line('谢谢惠顾');
      end case;
    end;
    
    • 多条件比较
    declare
      n int;
    begin
      n:=&n;
      case 
        when n>=80then
          dbms_output.put_line('优秀');
        when n>=70 then
          dbms_output.put_line('良好');
        when n>=60 then
          dbms_output.put_line('及格');
        else
          dbms_output.put_line('不及格');
      end case;
    end;
    

    循环

    • 使用loop循环,exit退出循环(if <条件> then exit)

    计算s=1+3+5+....+99

    declare
      i int:=1;
      s int:=0;
    begin
      loop
        s:=s+i;
        i:=i+2;
        if i>99 then
          exit;
        end if;
      end loop;
      dbms_output.put_line(s);
    end;
    
    • exit when <条件>

    计算5!

    declare
      i int:=1;
      s int:=1;
    begin
      loop
        s:=s*i;
        i:=i+1;
        exit when i>5;
      end loop;
      dbms_output.put_line('5!='||s);
    end;
    
    • WHILE LOOP循环

    计算N!(n由用户输入)

    declare
      i int:=1;
      s int:=1;
      n number;
    begin
      n:=&n;
      while i<=n
      loop
        s:=s*i;
        i:=i+1;
        exit when i>5;
      end loop;
      dbms_output.put_line(n||'!='||s);
    end;
    
    • FOR-LOOP循环
    declare
      i int:=1;
      s int:=1;
      n number;
    begin
      n:=&n;
      for i 1..n
      loop
        s:=s*i;
        i:=i+1;
      end loop;
      dbms_output.put_line(n||'!='||s);
    end;
    
    pictwo.png

    GOTO跳转语句

    declare
      x number;
    begin
      x:=10;
      <<begin_loop>>  --循环点
      x:=x-1;
      dbms_output.put_line(x);
      if x>0
        then
        goto begin_loop;  --只要x的值d大于0时,就goto到begin_loop
      end if;
    end;
    
    picthree.png

    练习

    1.使用 PL/SQL 编程输出 A 到 Z 之间的 26 个大写字母。

    declare
      letter char(4);
    begin
      for i in 0..25 loop
        select chr(i+65) into letter from dual;
      dbms_output.put_line(letter);
    end loop;
    end;
    
    1. 使 用 PL/SQL 编 程 , 实 现 提 示 输 入 班 级 编 号 , 在 输 入 班 级 编 号 后 , 使 用dbms_output.put_line 显示查询的班级名称。
    declare
      sclassname classinfo.classname%Type;
      sclassid classinfo.classid%Type;
    begin
      sclassid:= '&sclassid';
      select classname into sclassname
      from classinfo where classid= 'sclassid';
      dbms_output.put_line(sclassname);
    end;
    
    1. 使用 PL/SQL 编程,实现求 N!(即 N 的阶乘),测试 5!(即 5 的阶乘)。
    declare
      i int:=1;
      N int;
      s number:=1;
    begin
      N :=&N ;
      while i<=N
      loop
        s :=s*i;
        i :=i+1;
    end loop;
    dbms_output.put_line(N||'!='||to_char(s));
    end;
    
    1. 使用 PL/SQL 编程,求 S=1!+3!+5!+7!+…+N!,直到 S 大于 10000 时 N 的值和 S 的值。
    declare
      i int:=1;
      S number:=0;
      K number:=1;
    begin
      while s <=1000
      loop
        k:=k*i;
        i:=i+2;
        s:=s+k;
    end loop;
    dbms_output.put_line('s='||s);
    dbms_output.put_line('n='||i);
    end;
    
    1. 使用 PL/SQL 编程,计算 S=2+22+222+2222+22222+…+n 个 2,n 由用户输入。
    declare
      a int:=1;
      s number:=0;
      n int;
    begin
      n :='&n';
      for i in 1..n
      loop
        a:=(a*10)+2;
        s:=s+a;
    end loop;
    dbms_output.put_line('s='||s);
    end;
    

    相关文章

      网友评论

        本文标题:ORACALE之ProceldureLanguage

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