数据库讲义 __ 【PL/SQL基础】

 

  1. 【块的机构和声明变量----模块的组成】

    1、Declare           变量声明部分,可以没有

    2、Begin             逻辑处理执行部分,到 end 结束,必须有

    3、Exception        错误处理部分,可以没有

  1. End               结束部分

    块是我们 PL/SQL 的基石,我们的程序都是通过块组成,没有名称的块叫匿名块,完成一定的功能。因为没有名称,所以不能被调用。一般的用法为运行脚本,完成一定的功能

  1. 【为什么要使用PL/SQL】

    1、便于维护(模块化)

    2、提高数据安全性和完整性(通过程序操作数据)

    3、提高性能(编译好的)

4、简化代码(反复调用)

实验1:书写一个最简单的块,运行并检查结果

目的:该实验的目的是掌握简单的 pl/sql 语法。执行一个最简单的匿名块。

方法:书写一个最简单的块,将字符串输出到屏幕。使用的是 sqlplus 。输出 Hello world

过程:先设定 SQLPLUS 的环境变量,不指定默认值为不输出,设定后用show来验证。

set  serveroutput on   --设置 sqlplus 环境的输出

show  serveroutput    --验证 sqlplus 环境变量

begin                         --开始部分的标记

dbms_output.put_line('-----------------输出------------------');              --输出

dbms_output.put_line('hello world');                                       --输出

dbms_output.put_line('-----------------结束------------------');        --输出

end;                            --模块结束的标记

/

每句话以分号结束,最后加上 / 来运行

上页的PL/SQL执行结果如下:

set  serveroutput on

begin

dbms_output.put_line ('-----------------输出------------------');

dbms_output.put_line ('hello world');

dbms_output.put_line ('-----------------结束------------------');

end;

/

将上面存储为文件 c:\bk\out.txt

SQL>  @ c:\bk\out.txt

@文件名称是运行该文件,最好是指定绝对路径,如果只给文件名称,将使用相对路径。                                                                                          使用变量的目的:变量用来存储数据,操作存储的数据,可以重复应用,使维护工作简单。

                                   【【 语法规则 】】

    Dentifier  [ CONSTANT ]  datatype  [ NOT NULL ]  [ := | DEFAULT expr ];

[ ]内为可选项 每行定义一个变量 在 declare 部分声明

实验2:在块中操作变量

注意:在开发中要规范统一的变量命名模式!

    Declare                                     --声明部分的开始标记

    v_hiredate  date                        --声明变量

    v_deptno  number(2)  not null := 10;

    v_location  varchar2(13) := ‘Atlanta’        --声明变量,并给初值

    c_comm  constant  number := 1400;--声明变量,并给初值

    v_valid  boolean  not null := TRUE; --声明变量,并给初值

 

    not null 一定要给初值。

    constant 也一定要给值。

:= 为赋值,=为逻辑判断,判断是否相等

1、【【  变量的命名规则  】】

    1、在不同的模块中,变量可以重名。

    2、变量的名称不应该和模块中引用的列的名称相同,避免两意性。

    3、变量名称应该有一定的可读性

  1. %TYPE的属性

    1、在不同的模块中,变量可以重名。

    2、变量的名称不应该和模块中引用的列的名称相同,避免两意性。

3、变量名称应该有一定的可读性

3、切记

    1、在 begin 和 end 间是执行部分,是一个模块的必须部分。

    2、--是行注释

3、/* */是多行注释

4、变量的作用范围:

外部模块变量可以传到内部模块,内部模块的变量不会影响外部。

 

实验3:在块中操作表的数据

注意:使用隐式的指针探测 sql 的运行,一定马上取值才正确!

  1. 【取表中的数据】

    declare

    v1  emp.ename%type;

    v2  emp.sal%type;

    begin

    select  ename, sal  into  v1,v2  from  emp  where empno=7900;    --pl/sql 的 select

    dbms_output. put_line ( v1 );

    dbms_output. put_line ( v2 );

    end;

/

在程序中的 select 一定要有 into,一次只能操作一行,操作多行得用循环,变量类型和个数要匹配

  1. 【DML语句和sql相同】

    使用隐式游标的属性来控制 dml,有四种隐式的游标。每个 dml 运行完成都可以检测该语句的属性,

    SQL%ROWCOUNT

    SQL%FOUND

    SQL%NOTFOUND

    SQL%ISOPEN

   下面的语句使用 sql%rowcount 来探测上面运行的删除语句操作了多少行!

    declare

    v1  emp.deptno%type :=20;

    v2  number;

    begin

    delete  emp  where  deptno=v1;

    v2:= sql%rowcount;

    dbms_output.put_line ('delete rows :');

    dbms_output.put_line ( v2 );

    rollback;

    end;

/

 

实验4:块中的分支操作if结构

     分支就是树的结构,条件就是分支的选择,我们只能走到一个支干上,即使每个条件都符合,我们也只能操作一个支干的语句。一句话,分之就是爬树,你只能从树的跟部爬到一个树支,而不能在树支间跳跃。

If upper (v_last_name) = ‘scott’ then

v_mgr := 102;

end if;

1、【普通语句】

       declare

              v1 date := to_date(’12-11-1990’,’mm-dd-yyyy’)

v2 boolean;

begin

       if  months between(sysdate , v1) > 5 then

              v2 := ‘true’;

              dbms_output.put_line(‘true’);

       else

              v2 := ‘false’;

              dbms_output.put_line(‘false’);

       end  if

       end

       /

2、【Case语句】

       Declare

              v1 char(1)  := upper(‘ &v1 ’)

              v2 varchar(20);

              v2 := case v1

                     when ‘A’ then ‘Excellent’

                     when ‘B’ then ‘Very good’

                     when ‘C’ then ‘Good’

                     else  ‘No such grade’

                     End

              dbms_output.put_line(‘级别为:’  ||   v1  ||   ‘是’   ||   v2) ;

End;

/

【【  Null的逻辑运算真值表  】】

  1. true and null 的结果为null;
  2. false and null 的结果为false;

实验5:在块中使用循环,三种循环模式

       点评:for循环比较好,不能进入死循环

1、【基本的loop循环】

       Drop  table  t1  purge

       Create table t1 (c1 number(2));

       Select * from t1;

       建立实验表 t1,我们将想 t1 表中加入数据。Loop 循环必须含有退出的条件,而且该条件一定要每次循环都要变化,如果没有变化就是死循环,死循环的结果就是 cpu 总是100%,你可以重新启动数据库来消除死循环

       Declare

              v1 number(2) := 1;

       Begin

              Loop

                     Insert into t1 values(v1);

                     v1 := v1+1;

                     Exit When v1>10;

              End loop

              End;

/

2、【While循环】:先判定条件,每次循环时条件都要变化,否则会进入死循环、

       Declare

              v1 number(2) :=  1;

       Begin

              While v1<10 loop

              Insert into t1 values(v1);

              v1 :=  v1+1

              End loop

       End;

       /

3、【for循环】:pl/sql中最常见的循环,是和游标操作的绝配,方便而直观。

       正序从1插到9

Begin

              For v1 in 1..9 loop

                     Insert into t1 values(v1);

              End loop;

       End;

/

 

倒序从9插到1

Begin

              For v1 in reverse 1..9 loop

                     Insert into t1 values(v1);

              End loop;

       End;

/

4、【【  for循环的特点  】】

       步长只能为 1。计数器不要声明,自动声明。对计数器只能引用。不能做赋值操作。

计数器的数据类型和上下界的数据类型相同。计数器只能在循环体内引用。

通过以上五点我们发现 for 循环是专门为处理表设计的。For 循环和游标配合使用是绝配!

Oracle 数据库中有两个引擎,sql 引擎和 pl/sql 引擎,我们在 pl/sql 的模块中调用了 sql

语句,数据库就要在两个引擎中来回的切换,如果我们使用循环来处理 sql 语句的话,就会造

成频繁的在两个引擎中进行切换。为了避免这样的情况发生,我们最好是将要传递的值放入

到复合变量中,一次传递更多的数据,这个技术叫做批量绑定。既然不是循环,所以批量绑定

的语法也有变化,是 for all,没有 loop 关键字

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值