一、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;

这是答案:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,888评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,677评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,386评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,726评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,729评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,337评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,902评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,807评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,349评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,439评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,567评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,242评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,933评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,420评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,531评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,995评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,585评论 2 359