zoukankan      html  css  js  c++  java
  • Oracle数据库的PLSQL

    PLSQL

      一:plsql是procedural language sql:过程化sql语言,是oracle数据库中可以实现一些复杂的计算和功能。

      其实是在基本的sql语言中,加入了循环。判断等逻辑的一种数据库编程方式,运行在oracle数据库上。

      二:作用

        更高效率的的进行大数据量的运算。

      三:优缺点

        优点:效率高

        缺点:编写与维护性低,开发测试效率低,非面向对象语言。

      四:格式

        基本格式:

          declare

            --变量的声明区域

          最简格式:

          /

          begin

            业务逻辑区域

            --exception

          end

          /

        说明:变量的声明

            变量名 类型名:=值;

            不赋值时,变量的默认值为null,作运算时,null与任何值运行的结果都是null。

            ==表示判断是否相等

            */*必须要存在

            plsql只是一个定义好的匿名代码块,只能在oracle数据库中编译和运行一次,不会存储在oracle中,如果存储,需要定义成存储过程,函数,触发器。

      五:练习

        -->使用最简格式,输出打印"Hello plsql"。

        set serveroutput on;  --开启输出功能

        begin

          dbms_output.put_line('Hello plsql');

        end;

        /

        -->显示  姓名  年龄  出生年月日

          begin

            dbms_output.put_line('lyr');

            dbms_output.put_line('20');

            dbms_output.put_line('1997-3-6');

          end;

          /

      六:plsql的使用

        1.-->注释,--单行注释,/*.....*/多行注释。

        2.

          declare

            变量名 类型

            变量名 类型:=值;

          begin

          end;

            /

      七:练习

        -->定义一个a,b,c,a=5,b=6,c=a+b,输出c的值。

        declare

          a number:=5;

          b number:=6;

          c number;

        begin

          c:=a+b;

          dbms_output.put_line(c)

        end;

         /    

        -->定义变量name,age,赋值输出。

        declare

          name varchar2(20);

          age number(2);

        begin

          name:='lyr';

          age:=20;

          dbms_output.put_line('name='||name||' age='||age);

        end;

         /

        

    判断

      1:基本格式

        if 条件 then

          ..

        elsif 条件 then

          ..

        else

          ..

        end if;

      2:练习

        -->定义一个变量gender 赋值,如果为'M',输出男,如果为'F',输出女,否则输出性别不详。  

        declare

          gender varchar(20);

        begin

          gender:='M';  

          if gender='M' then

            dbms_output.put_line('男');

          elsif gender='F' then

            dbms_output.put_line('女');

          else

            dbms_output.put_line('性别不详');

          end if;

        end;

         /

    loop循环

      1:基本格式

        loop

          循环内容

          exit when 结束条件;  

        end loop;

      2:练习

        -->输出1-10。

        declare  

          i number:=1;

        begin

          loop 

            dbms_output.put_line(i);

            i:=i+1;

            exit when i>10;

          end loop;

        end;

         /

    while循环

      1:基本格式

        while 条件 loop

          业务逻辑

          循环变量改变

        end loop;

      2:练习

       -->使用while循环计算100以内奇数的和。

          declare

            i number:=1;

            s number:=0;

          begin

            while i<101

              loop

                s:=s+i;

                i:=i+2;

              end loop;

            dbms_output.put_line(s);

          end;

           /

    for循环

      1:基本格式

        for 变量 in 集合 loop

        end loop

        说明:集合必须是数字集合,1..10表示1~10的整数。

      2:练习

        -->使用for循环输出1-10。

        begin

          for i in 1..10

            loop

              dbms_output.put_line(i);

            end loop;

          end;

           /

    PLSQL使用DML和TCL

        

      1:没有特殊情况,直接使用。

      2:练习

        --> 对表dept,增加一条数据 100,'qqq','cc',修改40号部门的地址为南关。

          begin

            insert into dept values(100,'qqq','cc');

            update dept set loc='南关' where deptno=40;

          end;

          /

    PLSQL使用DQL

      1:说明

        plsql中使用DQL语言,不只是为了查询,因为如果查询的话,普通的sql语句比较方便,而plsql中使用DQL目的是将查询的数据封装到变量中,进行其他的逻辑运算。

        --返回单行数据

          select colName1,colName2 into 变量1,变量2 from ....

      2:练习

        查询10号部门的名称和地址封装到变量a和b进行拼接输出。

        declare

          a varchar2(20);

          b varchar2(20);

        begin

          select dname,loc into a,b from dept where deptno=10;

          dbms_output.put_line(a||'  '||b);

        end;

        /

        --返回多行数据

          1:使用游标

            会将多条数据封装到游标中,相当于java的ResultSet。

            游标默认会在第一行,每fetch一次,游标就会向下行移动,当成功移到下一行时,游标就有一个状态:found,当游标移到最后一行时,再次fetch时,不会移动,但是状态变为not found。

        2:格式

          declare

            cursor 游标名 is select 语句....;

            变量 类型

          begin  

            open 游标名;

              loop

                fetch 游标名 into 变量1,变量2...

                exit when 结束条件(游标民%not found)

              end loop;

            close 游标名;

           end;

            /

        3:练习

          -->输出显示10号部门的员工姓名,职位,工资。

          declare

            cursor c is select ename,job,sal from emp where deptno=10;

            na varchar2(20);

            j varchar2(20);

            sal number(20);

          begin

            open c;

            fetch c into na,j,sal;

            while (c%found) 

              loop

                dbms_output.put_line(na||' '||j||' '||sal);

                fetch c into na,j,sal;

              end loop;

            close c;

          end;

           /

    --自己练习:
    set serveroutput on;
    declare 
    begin
      dbms_output.put_line('dsada');
    end;
    /
    
    declare 
      a number;
      b number;
      c number;
    begin
      a:=1;
      b:=2;
      c:=a+b;
      dbms_output.put_line(c);
    end;
    /
    
    declare
      i number;
      j number;
    begin
      i:=&请输入一个数字;
      j:=&请输入一个数字;
      dbms_output.put_line(i+j);
    end;
    /
    
    declare
      a number;
      b number;
    begin
      a:=&请输入一个数字;
      b:=&请输入一个数字;
      if a>b then
        dbms_output.put_line('a>b');
      elsif a<b then
        dbms_output.put_line('a<b');
      else
        dbms_output.put_line('a=b');
      end if;
    end;
    /
    
    declare
      i number;
      n number;
    begin
      i:=1;
      n:=&请输入一个数字;
      loop 
        dbms_output.put_line(i);
        i:=i+1;
        exit when i>n;
      end loop;
      
    end;
    /
    
    
    declare
      i number;
      n number;
      s number;
    begin
      i:=1;
      n:=&请输入最大值N;
      s:=0;
      loop 
        s:=s+i;
        i:=i+1;
        exit when i>n;
      end loop;
      dbms_output.put_line(s);
    end;
    /
    
    declare
      n number;
      i number;
    begin
      i:=1;
      n:=&请输入上限;
      while i<n loop
        dbms_output.put_line(i);
        i:=i+1;
      end loop;
    end;
    /
    
    declare 
      i number;
      n number;
    begin
      i:=0;
      n:=&请输入一个数字;
      for i in 1..n loop
        dbms_output.put_line(i);
      end loop;
    end;
    /
    
    begin
      insert into dept values(90,'qqq','cc');
      update dept set loc = 'dasda';
      rollback;
    end;
    /
    select * from dept;
    
    
    declare
      a varchar2(20);
      b varchar2(20);
    begin
      select dname,loc into a,b from dept where deptno =10;
      dbms_output.put_line(a||' ' ||b);
    end;
    /
    
    declare
      a dept.dname%type;
      b dept.loc%type;
    begin
      select dname,loc into a,b from dept where deptno=10;
      dbms_output.put_line(a||' '||b);
    end;
    /
    
    declare
      cursor c is select ename,sal,empno from emp where deptno=10;
      na varchar2(20);
      sa number(20);
      emp number(20);
    begin
      open c;
      fetch c into na,sa,emp;
        while (c%found) loop
          dbms_output.put_line(na||' '||sa||' '||emp);
          fetch c into na,sa,emp;
        end loop;
      close c;
    end;
    /
    
    
    declare
      cursor c is select ename,job,sal from emp where deptno=10;
      na varchar2(50);
      j varchar2(50);
      sal number(10);
    begin
      open c;
       fetch c into na,j,sal;
        while(c%found) loop
          dbms_output.put_line(na||' '||j||' '||sal);
          fetch c into na,j,sal;
        end loop;
      close c;
    end;
    /
    
    declare 
      cursor c is select ename,sal,mgr from emp;
      name varchar2(74);
      sal number;
      mgr number;
    begin
      open c;
      fetch c into name,sal,mgr;
      while c%found loop
        dbms_output.put_line(name||' '||sal||' '||mgr);
        fetch c into name,sal,mgr;
      end loop;
      close c;
    end;
    /
    
    declare
      cursor c is select deptno from dept;
      d number;
    begin
      open c;
      fetch c into d;
      loop 
        dbms_output.put_line(d);
        fetch c into d;
        exit when c%notfound;
      end loop;
    end;
    /
    
    declare 
      cursor c is select ename from emp;zz  name varchar2(50);;
    begin
      open c;
      dbms_output.put_line(c%notfound);
      fetch c into name;
      while c%found loop
        dbms_output.put_line(name);
        fetch c into name;
      end loop;
      close c;
    end;
    /
    练习

      

          

    ---恢复内容结束---

  • 相关阅读:
    数据库中生成UUID的方式
    db2如果修改主机名之后
    linux修改主机名
    db2动态查看备份进度
    oracle-DG
    linux环境变量和对应文件的生效顺序
    数据泵与传统exp/imp对比
    oracle之ogg部署(RAC到单机)
    oracle之ogg部署(单机到单机)
    达梦 (实时主备+数据守护)测试
  • 原文地址:https://www.cnblogs.com/lyr999736/p/9050846.html
Copyright © 2011-2022 走看看