Oracle PL/SQL 第二章--块结构与标识符
目录
(3)子程序(Subprogram) —— 存储过程(Procedure)
(4)子程序(Subprogram) —— 函数 (Function)
1、PL/SQL块结构的基本单元框架
DECLARE
--声明部分:这是一个可选部分,主要是声明变量、常量、游标、自定义记录类型,以及局部的存储过程和函数
BEGIN
--执行部分:这是一个强制性部分。它由程序的可执行PL/SQL语句组成。
--它应该有至少一个可执行代码行,它可以只是一个NULL命令,表示不执行任何操作。
EXCEPTION
--异常处理部分:这是一个可选部分,主要是错误处理
END;
提示:(1)执行部分不能省略。
(2)EXCEPTION 必须写在 BEGIN ... END 之间,否则程序会报错。
2、PL/SQL 的块分类
1、匿名块(Anonymous Blocks): 是能够动态地创建和执行过程代码的PL/SQL结构,而不需要以持久化的方式将代码作为数据库对象储存在系统目录中。动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。
2、命名块(Named Block): 是带有名称的匿名块,这个名称就是标签。
3、子程序(Subprogram): 存储在数据库中的存储过程、函数等。当在数据库上建立好后可以在其它程序中调用它们。
4、触发器(Trigger): 当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
5、程序包(package): 存储在数据库中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。
简单案例说明:
(1)匿名块(Anonymous Blocks)
--匿名块
Declare
varName VARCHAR2(10);
Begin
Select Name Into varName From dual;
DBMS_OUTPUT.PUT_LINE(varName);
Exception
When NO_DATA_FOUND Then
DBMS_OUTPUT.PUT_LINE('未查到到任何数据');
End;
(2)命名块(Named Block)
--命名块
--<<OUTER>>
Declare
varName VARCHAR2(10);
Begin
SELECT Name INTO varName FROM dual;
DBMS_OUTPUT.PUT_LINE(varName);
Exception
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('未查到到任何数据');
End;--<<OUTER>>
(3)子程序(Subprogram) —— 存储过程(Procedure)
--子程序 存储过程
Create Or Replace Procedure test_procedure (flag out VARCHAR2) as
varMsg VARCHAR2(100);
Begin
varMsg := 'I am a subroutine stored procedure.';
DBMS_OUTPUT.PUT_LINE(varMsg);
flag := 'The stored procedure call was successful.';
Exception
WHEN OTHERS THEN
flag := 'The stored procedure call was failure.';
End;
(4)子程序(Subprogram) —— 函数 (Function)
--子程序 函数
Create Or Replace Function test_function Return Number Is
varRecordNum Number(10) := 0;
Begin
Select count(*) Into varRecordNum From Scott.EMP;
DBMS_OUTPUT.PUT_LINE('总的记录条数为:' || varRecordNum);
Return varRecordNum;
End;
(5)触发器(Trigger)
--触发器
CREATE OR REPLACE TRIGGER test_trigger
BEFORE DELETE OR INSERT OR UPDATE ON customers
FOR EACH ROW
WHEN (NEW.ID > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :NEW.salary - :OLD.salary;
dbms_output.put_line('Old salary: ' || :OLD.salary);
dbms_output.put_line('New salary: ' || :NEW.salary);
dbms_output.put_line('Salary difference: ' || sal_diff);
END;
(6)程序包(Package)
-- 包(pakage)和包体(package body)
-- 首先创建一个包含字段comm的emp表,再创建下面的包和包体
create or replace package test_package
is
-- 声明全局变量:默认奖金数额
g_comm number:=100;
-- 声明存储过程:用于重置奖金数额
procedure proc_reset_comm(p_comm in number);
-- 声明函数:用于求所有员工中最高工资
function func_maxsal_emp return number;
end test_package;
--==================================================
--包体(package body)
create or replace package body test_package
is
-- 实现存储过程
procedure proc_reset_comm(p_comm in number)
is
begin
if nvl(p_comm,0)>g_comm then
g_comm:=p_comm;
end if;
dbms_output.put_line(g_comm);
end proc_reset_comm;
------------------------------------
-- 实现函数
function func_maxsal_emp return number
is
v_maxsal emp.sal%type;
begin
select max(sal) into v_maxsal from a_emp;
return v_maxsal;
end func_maxsal_emp;
end;
3、PL/SQL的标识符
PL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同。要求和限制有:
- 标识符名称不能超过30字符
- 第一个字符必须为字母
- 不区分大小写
- 不能用 ‘-’ (减号)
- 不能是SQL保留字
提示:一般不要把声明的变量名称和数据库表中字段完全一样,如果这样可能得不到正确的结果。
例如:下面的例子将会删除所有的记录,而不是‘Bob’这一条记录。
Declare
ename varchar2(20) := 'Bob';
Begin
delete from scott.emp where ename = ename;
End;
变量名称在PL/SQL中有特别的规则,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求,使得整个系统的文档在规范上达到要求。