- 【块的机构和声明变量----模块的组成】
1、Declare 变量声明部分,可以没有
2、Begin 逻辑处理执行部分,到 end 结束,必须有
3、Exception 错误处理部分,可以没有
- End 结束部分
块是我们 PL/SQL 的基石,我们的程序都是通过块组成,没有名称的块叫匿名块,完成一定的功能。因为没有名称,所以不能被调用。一般的用法为运行脚本,完成一定的功能
- 【为什么要使用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、变量名称应该有一定的可读性
- %TYPE的属性
1、在不同的模块中,变量可以重名。
2、变量的名称不应该和模块中引用的列的名称相同,避免两意性。
3、变量名称应该有一定的可读性
3、切记
1、在 begin 和 end 间是执行部分,是一个模块的必须部分。
2、--是行注释
3、/* */是多行注释
4、变量的作用范围:
外部模块变量可以传到内部模块,内部模块的变量不会影响外部。
实验3:在块中操作表的数据
注意:使用隐式的指针探测 sql 的运行,一定马上取值才正确!
- 【取表中的数据】
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,一次只能操作一行,操作多行得用循环,变量类型和个数要匹配
- 【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的逻辑运算真值表 】】
- true and null 的结果为null;
- 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 关键字