【IT168 技术文档】
PL/SQL简介:
概念:
优点:性能,可移植
块特性:
DECLARE
声明变量、常量的程序块
声明部分不能是oracle的保留字,help reserved words
BEGIN
执行语句部分的程序块,至少有一句执行语句。比如null;
EXCEPTION
异常处理部分的程序块,如果声明和执行部分出现错误,oracle停止这些块的处理,跳转到异常块,是一种回退机制
END;
/
/ 是sqlplus中的块终止符,用户输入/ 并回车后,oracle 将刚才输入的代码块传递给数据库的PL/SQL引擎。
set serveroutput on
declare
l_text varchar2(200);
begin
l_text :=”hello, world”;
dbms_output.put_line(l_text);
exception
when others then
dbms_output.put_line(“We encountered an exception!”);
raise;
end;
/
set serveroutput on
declare
l_number number :=1;
begin
l_number++;
dbms_output.put_line(‘1+1=’|| to_char(l_number)||’!’);
exception
when others then
dbms_output.put_line(‘We encountered an exception!’);
end;
/
块嵌套:
程序块可以在可执行部分和异常处理部分包含另外的程序块
set serveroutput on
declare -- begin block 1
l_text varchar2(100);
begin
l_text := ‘Block1’;
dbms_output.put_line(l_text);
declare --begin block 2
l_more_text varchar2(100);
begin
l_more_text := ‘Block2’;
dbms_output.put_line(l_more_text);
end; -- end block 2
end; -- end block 1
/
声明部分:
变量和常量都必须在声明( declare )部分定义,必须规定名称和数据类型。
Declare
L_number number;
Begin
L_number :=100;
End;
/
也可以在声明部分为变量赋值,即初始化变量。
Declare
L_number number := 100;
Begin
Null;
End;
/
常量:
1、 不能改变
2、 必须在声明的时候初始化常量
3、 必须在数据类型的左边规定constant
declare
l_number constant number := 10;
begin
null;
end;
/
如果没有初始化:
declare
l_number constant number;
begin
null;
end;
/
报错,不同于在异常块中定义的异常,这是一种编译期间的错误,异常块捕捉不到。
如果执行过程中改变常量:
declare
l_number constant number := 10;
begin
l_number := 20;
end;
/
报错。
为常量变量赋值:
:=
声明部分可以指定默认值:
variable datatype default expression;
declare
l_weeks_in_month number default 4;
begin
l_weeks_in_month := 5;
end;
/
使用not null 操作符:
declare
l_number number not null := 1;
l_number2 number;
begin
l_number:=10;
l_number:=l_number2;
end;
/
作用域:
declare
l_parent_number number;
begin
l_parent_number :=1;
declare
l_child_number number :=2;
begin
dbms_output.put_line(l_parent_number);
end;
l_child_number :=3;
end;
/
l_parent_number 整个块内都可见,l_child_number只在黑体部分可见。
可视性:
Declare
L_number1 number := l_number2;
L_number2 number :=10;
Begin
Null;
End;
/
只有声明之后,pl/sql才知道变量/常量的存在。
数据类型:
PL/SQL与SQL使用相同的数据类型,只是界限上有些不同。罗列一些不同。
记录:
TYPE
字段 类型。。。
);
declare
type location_record is record(
city varchar2(30),
state varchar2(30)
);
l_my_loc location_record;
begin
l_my_loc.city :=’Reston’;
l_my_loc.state :=’CA’;
dbms_output.put_line(l_my_loc.city);
dbms_output.put_line(l_my_loc.state);
end;
/
使用%TYPE和%ROWTYPE
%ROWTYPE: 当用户声明表示表,视图或者游标的某个行的记录变量时,使用
如果,不是声明整个行的变量,而是某个列的时候,使用%TYPE
connect hr/hr
desc departments
declare
l_dept departments%rowtype;
l_dept_name departments.department_name%type;
begin
l_dept.department_id:=1000;
l_dept.department_name:=’AA’;
insert into departments(department_id, department_name)
values(l_dept.department_id, l_dept.department_name);
l_dept.department_id:=1001;
l_dept_name:=’BB’;
insert into departments(department_id, department_name)
values(l_dept.department_id, l_dept_name);
end;
/
逻辑比较:
控制语句:
条件
1. IF .. THEN ..ELSE 语句:
1) IF .. THEN
…;
END IF;
2) IF ... THEN
…;
ELSE
…
END IF;
3) IF ... THEN
…;
ELSIF … THEN
…;
ELSE
…;
END IF;
2. CASE 语句
CASE 变量
WHEN 值1 THEN
…;
WHEN 值2 THEN
…;
ELSE …;
END CASE;
~~~~~~~~~~~~~~~~~~~~~~~~~~~
CASE
WHEN 条件1 THEN
…;
ELSE
…;
END CASE;
循环:
1. 无条件循环:
declare
l_loops number:=0;
begin
loop
if l_loops >4 then
exit;
end if;
dbms_output.put_line(‘Looped ‘ || l_loops || ‘times’);
l_loops := l_loops + 1;
end loop;
end;
/
declare
l_loops number:=0;
begin
loop
exit when l_loops > 4;
dbms_output.pub_line(‘Looped ‘ || l_loops || ‘times’);
l_loops : = l_loops: + 1;
end loop;
end;
/
2. FOR循环
Declare
Begin
For I in 1.. 4 loop
Dbms_output.put_line(I);
End loop;
End;
/
降序:for I in reverse 4.. 1 loop
3. WHILE 循环
declare
l_loops number:=0;
begin
while l_loops < 5 loop
dbms_output.put_line(‘Looped ‘ || l_loops || ‘times’);
l_loops := l_loops + 1;
end loop;
end;
goto 语句
异常和游标管理
游标:
用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。
分类:
静态游标:
分为显示游标和隐示游标。
REF游标:
是一种引用类型,类似于指针。
显示游标:
CURSOR 游标名 ( 参数 ) [返回值类型] IS
Select 语句
生命周期:
1. 打开游标(OPEN): 解析,绑定。。。
2. 从游标中获取记录(FETCH INTO):执行查询,返回结果集
3. 关闭游标(CLOSE)
隐示游标:
不用明确建立游标变量,分两种:
1. 在PL/SQL中使用DML语言,使用ORACLE提供的名为SQL的隐示游标
2. CURSOR FOR LOOP
1举例:
declare
begin
update departments set department_name=department_name
where 1=2;
dbms_output.pub_line(‘update ‘|| sql%rowcount ||’ records’);
end;
/
2举例:
declare
begin
for my_cursor in ( select department_name, department_id from departments)
loop
dbms_output.pub_line(my_cursor.department_id || ‘ : ’ my_cursor.department_name);
end;
/
游标属性:
%FOUND
%NOTFOUND
%ROWCOUNT
%ISOPEN
REF游标