一、PL/SQL基础语法

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基础语法)