Oracle PL/SQL 第二章--块结构与标识符

364 阅读5分钟

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中有特别的规则,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求,使得整个系统的文档在规范上达到要求。