美文网首页我爱编程
一、PL/SQL基础语法

一、PL/SQL基础语法

作者: 圣贤与无赖 | 来源:发表于2018-04-17 14:03 被阅读0次

    1.pl/sql介绍

      plsql是对标准的sql的扩展,扩展了可编程语言的特点

      在plsql中可以具备编程性语言具备的特征

      * 定义变量

      * 数据类型

      * 分支结构

      * 循环结构

      * 数组

      * 函数/存储过程

    2.pl/sql的好处

      模拟银行转账

           java代码实现:业务方法

            账户加

            账户减

            记录你的历史记录

            记录对方的历史记录

       ----需要调用dao的方法,访问数据库n次,完成一个业务操作,降低系统的响应速度

       psql代码实现:业务方法

            将转账的过程中需要的n个sql语句,进行打包

            直接打包到数据库----plsql模块化编程

            zhuanzhang :  sql1.....sqln

       ----提高了数据库的交互效率

       ----plsql解决复杂的业务问题(n次和数据库的交互业务)

    3.plsql的基础语法

    plsql块:相当于java中代码块(java:{})

    declare

        --声明变量

    begin

        --实现代码功能(代码语句)

    end;

    4.数据类型的学习

    -- 标量类型  varchar,varchar2,number,datatime,boolean,%type,%rowtype

    -- 符合类型  table  record

    5.简单的变量声明和赋值

     DECLARE

    --声明变量

      v_name VARCHAR(30);

      v_age NUMBER(3);

    BEGIN

           --变量的赋值方式一

      v_name:='张三';

      v_age:=23;

         -- 变量赋值方式二 select sname,age into v_name,v_age from student where sno=1;

        --打印变量的值

      dbms_output.put_line(v_name||' '||v_age);

      END;

    输出:

    6.将表中的数据赋值给相应的变量

    --%type 使用拷贝表中某个列的数据类型

    --定义变量,将表中的数据赋值给响应的变量

    DECLARE输出

      --定义变量

      v_name student.sname%TYPE;

      v_age student.age%TYPE;

      BEGIN

        --赋值

        SELECT sname,age INTO v_name,v_age FROM student WHERE ssid=1;

        --打印变量的值

        dbms_output.put_line(v_name ||'  '||v_age);

        END;

    输出:

    7.用rowtype声明一个集合

    DECLARE

        --拷贝student表中所有列的数据类型

                    v_r student%ROWTYPE;

        BEGIN

          --将student表中ssid=1的所有数据赋值给v_r集合

                    SELECT * INTO v_r FROM student WHERE ssid=1;

                    dbms_output.put_line(v_r.sname||'  '||v_r.age||'  '||v_r.ssex);

          END;

    输出:

    8.用record声明一个类

          DECLARE

                    --自定义record数据类型

                    TYPE record_type IS RECORD(

                          v_name student.sname%TYPE,

                          v_age student.age%TYPE

                    );

                    --声明record_type的变量

                    v_r record_type;

          BEGIN

                    --给v_r变量 赋值

                    SELECT sname,age INTO v_r.v_name,v_r.v_age FROM student WHERE ssid=1;

                    dbms_output.put_line(v_r.v_name||'  '||v_r.v_age);

          END;

    9.用table声明一个数组

    DECLARE

                    --自定义table数据类型

                    TYPE type_table IS TABLE OF VARCHAR(30)  --声明数组中数据类型

                    INDEX BY VARCHAR(1); --声明数组下标的数据类型

                    v_tt type_table; --声明type_table的变量

     BEGIN

                    --变量赋值

                    v_tt('a'):='张三';

                    v_tt('b'):='李四';

                    v_tt('c'):='王二';

                    dbms_output.put_line(v_tt('a'));

                    dbms_output.put_line(v_tt('b'));

                      dbms_output.put_line(v_tt('c'));

     END;

    输出:

    10.if...else....流程控制结构

    --如果v_gread等于1,显示一颗星,否则显示两颗星

    DECLARE

                      v_gread NUMBER(3):=2;

            BEGIN

                      IF v_gread=1 THEN

                                  dbms_output.put_line('★');

                      ELSE

                                  dbms_output.put_line('★★');

                      END IF;

            END;

    11.case...end结构

     --查询student表的ssid、sanme、age、ssex列,age后面别忘加引号,后面还有个ssex

    select ssid,sname,age,

    case

        when ssex='1' then 'm'  --当ssex等于1时显示为f

        when ssex='0' then 'f'  ---等于0时显示为m

        when ssex is null then 's'  --为空值时显示为s

    end ssex    --被判断的值放在后面

    from student

    输出:

    12.decode 函数,相当于java中的switch case语句,可用来处理表中列的纵横转换

        select decode(3,1,'a',2,'b',3,'c','d') from dual;

    上面sql语句相当于java中:

    switch(3)

    {

    case 1:

    sout('a');

    break;

    case 2:

    sout('b');

    break;

    case 3:

    sout('c');

    break;

    default:

     sout('d');

    }

        使用decode函数完成表的纵横列转换:

            为了演示效果,我设计了一张比较奇怪的表:

    sql语句:

    select sname,

        min(decode(cname,'语文',score))  AS 语文,

        min(decode(cname,'数学',score)) AS 数学,

        min(decode(cname,'英语',score)) AS 英语

    from score

    group BY sname

    输出结果,完成转换:

    13.loop 循环结构

    --求1..100的和

    DECLARE

          v_sum NUMBER(5):=0;

          v_index NUMBER(5):=1;

      BEGIN

        LOOP

          v_sum:=v_sum+v_index;

          v_index:=v_index+1;

          IF v_index>100 THEN

            EXIT;

            END IF;

            END LOOP;

            dbms_output.put_line(v_sum);

            END;

    14.for循环

             DECLARE

                v_sum NUMBER(5):=0;

            BEGIN

              FOR v_index IN 1..100 LOOP

                  v_sum:=v_sum+v_index;

                  END LOOP;

                  dbms_output.put_line(v_sum);

                  END;

    15.while循环

    DECLARE

                  v_sum NUMBER(5):=0;

                  v_index NUMBER(3):=1;

              BEGIN

                WHILE v_index<=100 LOOP

                      v_sum:=v_sum+v_index;

                      v_index:=v_index+1;

                    END LOOP;

                    dbms_output.put_line(v_sum);

                    END;

    这是答案:

    相关文章

      网友评论

        本文标题:一、PL/SQL基础语法

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