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

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

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

相关文章
|
1月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
119 8
|
6月前
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
221 6
|
7月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
7月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
7月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
SQL
名称 不是有效的标识符 sql
1、执行sql提示 名称***不是有效的标识符    --添加括号 sql exec(sql) 2、sql中的单引号嵌套采用两个单引号'' 3、错误提示字符串转换为 smalldatetime 数据类型时失败   --将类型转换为字符型 caonvert(nvachar,@time)...
789 0
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
460 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
282 9
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
189 6

热门文章

最新文章

推荐镜像

更多