一、PL/SQL块结构
PL/SQL块三部分:定义部分、执行部分、例外处理部分,其中执行部分是必须的,其他部分可选
declare
/*
* 定义部分——定义常量、变量、复杂数据类型、游标、例解
*/
begin
/*
* 执行部分PL/SQL语句和SQL语句
*/
exception
/*
* 例外处理部分——处理运行错误
*/
end; --块结束标记
二、PL/SQL块分类
PL/SQL块分类分为四部分:匿名块、命名块、子程序和触发器
2.3 子程序
子程序包括过程、函数和包
(1)过程
过程用于执行特定操作,既可以指定输入参数(IN),也可以指定输出参数(OUT)
——输出小写名字
create or replace procedure getlowusername(username varchar2)
is
begin
dbms_output.put_line(lower(username));
end;
(2)函数
函数用于返回特定数据,函数头必须包含return子句,而在函数体内必须包含return语句返回数据。
——传入两个ingter类型参数,返回和
create function GetAddNumber(a integer,b integer)
return integer is
addnmber integer;
begin
addnmber:=a+b;
return addnmber;
end;
(3)包
包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成
包规范用于定义公用的常量、变量、过程和函数
——定义包规范
create package emp_pkg is
procedure update_sal(name varchar2,newsal number);
function addnumber(name varchar2) return number;
end;
——定义包体
create package body emp_pkg is
procedure update_sal(name varchar2,newsal number)
is
begin
....具体实现
end;
function addnumber(name varchar2) return number
is
begin
....具体实现
end;
end;
——调用
必须带包名作为前缀
call emp_pkg.addnumber('aa');
2.4、触发器
常用触发事件包括INSERT、UPDATE、DELETE
create trigger update cascade
after update of deptno on dept
for each row
begin
update emp set deptno=:new.deptno where deptno=:old.deptno;
end
当更新dept表的deptno列数据时就会级联更新emp表的deptno列的相关数据。
二、定义并使用变量
3.2 复合变量
复合变量是指存放多个值的变量。当定义复合变量时,必须要使用PL/SQL的复合数据类型
(1)记录
类似高级语言中的结构,一般包含多少成员
DECLARE
type emp_record_type is record(
edno DEPDEMO.DNO%type,
edname DEPDEMO.DNAME%type,
edpno DEPDEMO.DPNO%type
);
emp_r emp_record_type;
begin
select * into emp_r from DEPDEMO d where d.dno=0;
dbms_output.put_line(emp_r.edname);
end;
(2)PL/SQL表
PL/SQL表类似于高级语言中的数组。但是下标可以为负值没有上下限、且元素个数没有限制。
declare
type ename_table_type is table of emp.ename%type
index by binary_integer;
ename_table ename_table_type;
begin
select ename into ename_table(-1) from emp where empno=7788;
dbms_output.put_line('雇员名:'||ename_table(-1));
end;
(3)嵌套表
(4)变长数组(varray)
3.3 参照变量
参照变量是指用于存放数值指针的变量
(1)REF CURSOR
当使用显式游标时,需要定义显式游标时指定相应的select语句,这种显式游标称为静态游标。
declare
type c1 is ref cursor;
emp_cursor c1;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor for
select ename,sal from emp where deptno=10;
loop
fetch emp_cursor into v_ename,v_sal;
exit when emp_cursor%notfound;
dbms_output.put_line(v_ename);
end loop;
close emp_cursor;
end;
(2)REF obj_type
REF 实际上是指向对象实例的指针。