Oracle PL/SQL 第二章--块结构与标识符
目录
Oracle PL/SQL 第二章--块结构与标识符
1、PL/SQL块结构的基本单元框架
2、PL/SQL 的块分类
(1)匿名块(Anonymous Blocks)
(2)命名块(Named Block)
(3)子程序(Subprogram) —— 存储过程(Procedure)
(4)子程序(Subprogram) —— 函数 (Function)
(5)触发器(Trigger)
(6)程序包(Package)
3、PL/SQL的标识符
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中有特别的规则,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求,使得整个系统的文档在规范上达到要求。