Oracle PL/SQL Programming 第1章:Introduction to PL/SQL 读书笔记

总的目录和进度,请参见开始读 Oracle PL/SQL Programming 第6版

PL/SQL 是 “Procedural Language extensions to the Structured Query Language.”的缩写。

什么是PL/SQL?

Oracle 公司推出 PL/SQL 是为了克服 SQL 中的一些限制,并为那些寻求构建针对 Oracle 数据库运行的关键任务应用程序的人们提供更完整的编程解决方案。

PL/SQL的特点:

  • 它是一种高度结构化、可读性和可访问性的语言,易于学习。
  • 它是 Oracle 开发的标准且可移植的语言,哪里有Oracle数据库,哪里就有PL/SQL。
  • 它是一种嵌入式语言,只能在数据库中运行。
  • 它是一种高性能、高度集成的数据库语言。

PL/SQL起源

SQL是声明性、非过程性的编程语言。

PL/SQL 的早期发展

1988 年,Oracle 公司发布了 Oracle 版本 6,这是其关系数据库技术的重大进步。 该版本的一个关键组件是所谓的过程选项,即 PL/SQL。 大约在同一时间,Oracle 发布了期待已久的 SQL Forms 2.3 版升级版(该产品的原始名称现在称为 Oracle Forms 或 Forms Developer)。 SQL*Forms v3 首次在工具方面整合了 PL/SQL 引擎,允许开发人员以自然、直接的方式编码其过程逻辑。

PL/SQL解决了 Oracle 数据库和工具在其早期的2个关键弱点:缺乏可移植性和执行权限问题。

Oracle数据库是用C语言编写的

改进的应用程序可移植性

PL/SQL 语言过去(现在)旨在扩大可以完全在独立于操作系统的编程工具中处理的应用程序需求的范围。 PL/SQL对于可移植性的要求比Java更早,它继续允许开发人员编写高度可移植的应用程序代码。

提高执行权限和交易完整性

PL/SQL 语言提供对逻辑事务的严格控制和管理。 PL/SQL 实现此目的的一种方法是使用执行权限的实现。 您无需授予角色或用户更新表的权限,而是仅授予执行过程的权限,该过程控制并提供对底层数据结构的访问。这使得PL/SQL成为交易的“看门人”。这就是AUTHID子句,可以控制是使用调用者权限还是定义者权限。

起点卑微,稳步进步

尽管 SQL 功能强大,但它无法提供开发人员创建成熟应用程序所需的灵活性和功能。 Oracle 的 PL/SQL 语言确保我们可以完全处于独立于操作系统的 Oracle 环境中,并且仍然编写满足用户需求的高效应用程序。

随着PL/SQL不断发展,它添加了大量内置包,以多种方式和方向扩展了 PL/SQL 语言。 它引入了面向对象的功能,实现了各种类似数组的数据结构,增强了编译器以优化我们的代码并提供有关可能的质量和性能问题的警告,并且总体上提高了该语言的广度和深度。

这就是 PL/SQL

PL/SQL易于学习,因为:

  • 计算机语言本身就比人类语言简单,我们必须依靠非常严格的语法来告诉计算机我们想要它做什么。
  • PL/SQL依赖于具有高度结构化的“块”设计,所有部分都用明确的、自我说明的关键字进行标识。

与 SQL 集成

PL/SQL 最重要的方面之一是它与 SQL 的紧密集成。 您不需要依赖任何中间软件“粘合剂”,例如 ODBC或 JDBC。 您只需将 UPDATE 或 SELECT 插入代码中。

以下是一个匿名PL/SQL 块:

DECLARE
...
BEGIN
	SELECT ...
...
	UPDATE ...
END;

控制和条件逻辑

PL/SQL 使我们能够非常严格地控制程序的执行流。 包括:

  • 条件逻辑:IF 和 CASE 语句
  • 循环或迭代控件的完整补充:FOR,WHILE和LOOP
  • 跳转:GOTO 语句 (不建议用)

Oracle可以创建可重用的PL/SQL块,即过程和函数,以下是一个过程的示例:

-- 创建存储过程
CREATE OR REPLACE PROCEDURE conditional_procedure (
    p_input_parameter IN NUMBER
) AS
    v_output_message VARCHAR2(100);
BEGIN
    -- 使用条件判断执行不同的逻辑
    IF p_input_parameter > 0 THEN
        v_output_message := 'Input parameter is positive.';
    ELSIF p_input_parameter = 0 THEN
        v_output_message := 'Input parameter is zero.';
    ELSE
        v_output_message := 'Input parameter is negative.';
    END IF;

    -- 打印输出信息
    DBMS_OUTPUT.PUT_LINE(v_output_message);
END conditional_procedure;
/

-- 调用存储过程
DECLARE
    v_input_param NUMBER := 10;
BEGIN
    conditional_procedure(v_input_param);
END;
/

当出错时

PL/SQL 语言提供了强大的引发和处理错误的机制。

-- 创建自定义异常
CREATE OR REPLACE PROCEDURE custom_exception_procedure (
    p_input_parameter IN NUMBER
) AS
    -- 声明自定义异常
    custom_exception EXCEPTION;
    PRAGMA EXCEPTION_INIT(custom_exception, -20001);
BEGIN
    -- 使用条件判断执行不同的逻辑
    IF p_input_parameter > 0 THEN
        DBMS_OUTPUT.PUT_LINE('Input parameter is positive.');
    ELSIF p_input_parameter = 0 THEN
        DBMS_OUTPUT.PUT_LINE('Input parameter is zero.');
    ELSE
        -- 抛出自定义异常
        RAISE custom_exception;
    END IF;

EXCEPTION
    -- 捕获自定义异常
    WHEN custom_exception THEN
        DBMS_OUTPUT.PUT_LINE('Input parameter is negative. Custom Exception Raised.');
    -- 捕获其他异常
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END custom_exception_procedure;
/

-- 调用存储过程
DECLARE
    v_input_param NUMBER := -5;
BEGIN
    custom_exception_procedure(v_input_param);
END;
/

关于 PL/SQL 版本

Oracle 数据库的每个版本都带有其自己对应的 PL/SQL 版本,也就是说数据库的版本就是PL/SQL的版本。 版本越新,功能越多。PL/SQL 程序员最大的挑战之一就是跟上。 我们需要不断地自我教育每个版本中的新功能,弄清楚如何使用它们以及如何将它们应用到我们的应用程序中,并确定哪些新技术非常有用,以至于我们应该修改现有应用程序以利用它们。

SQL> select banner FROM v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Oracle Database 12c 新 PL/SQL 功能

  • 更多跨 PL/SQL 到 SQL 接口的仅 PL/SQL 数据类型
  • ACCESSIBLE_BY 子句
  • 隐式语句结果
    在 Oracle Database 12c 之前,PL/SQL 存储子程序通过 OUT REF CURSOR 参数或 RETURN 子句显式返回 SQL 查询的结果集。 然后,客户端程序必须显式绑定到这些参数才能接收结果集。 现在,PL/SQL 存储子程序可以使用 PL/SQL 包 DBMS_SQL 而不是 OUT REF CURSOR 参数将查询结果隐式返回到其客户端。 通过此功能,可以轻松地将依赖于存储子程序(受 Transact SQL 等语言支持)隐式返回查询结果的应用程序从第三方数据库迁移到 Oracle 数据库。
  • BEQUEATH CURRENT_USER 视图
  • FETCH FIRST 子句和 BULK COLLECT
  • UTL_CALL_STACK 包

面向 PL/SQL 开发人员的资源

O’Reilly 于 1995 年出版了本书的第一版。

O’Reilly PL/SQL 系列

  • Oracle PL/SQL Programming
  • Learning Oracle PL/SQL
  • Oracle PL/SQL Best Practices
  • Oracle PL/SQL Developer’s Workbook
  • Oracle Built-in Packages
  • Oracle PL/SQL for DBAs
  • Oracle PL/SQL Language Pocket Reference
  • Oracle PL/SQL Built-ins Pocket Reference

互联网上的 PL/SQL

一些建议

别太着急!

我们几乎总是在紧迫的期限内工作,或者在一次又一次的挫折中奋起直追。 我们没有时间可以浪费,还有大量的代码要编写。 那么让我们开始吧——对吧?

错误的。 如果我们太快地深入代码构建的深处,盲目地将需求转换为数百、数千甚至数万行代码,我们最终会陷入一团糟,几乎无法调试和维护。 不要惊慌地应对迫在眉睫的最后期限; 如果您仔细计划,您更有可能在最后期限前完成任务。

我强烈建议您抵制这些时间压力,并确保在启动新应用程序,甚至在应用程序中的特定程序之前进行以下操作:

  • 在编写代码之前构建测试用例和测试脚本
    在编写一行程序之前,您应该确定如何验证是否成功实现。 如果这样做,您更有可能获得正确的程序接口,因为它将帮助您彻底确定程序需要做什么。

  • 为开发人员如何在应用程序中编写 SQL 语句制定明确的规则
    一般来说,我建议个人开发人员不要编写大量 SQL。 相反,这些单行查询、插入和更新应该“隐藏”在预先构建且经过彻底测试的过程和函数后面(这称为数据封装)。 与分散在代码中的 SQL 语句(其中许多是冗余的)相比,这些程序可以更有效地优化、测试和维护

  • 为开发人员如何处理应用程序中的异常建立明确的规则
    团队中的所有开发人员都应该以相同的方式提出、处理和记录错误。 执行此操作的最佳方法是创建一个错误处理包,该包隐藏如何保留错误日志的所有详细信息,确定如何引发异常并通过嵌套块向上传播,并避免对特定于应用程序的异常进行硬编码。 确保所有开发人员都使用此包,并且他们不会编写自己的复杂、耗时且容易出错的错误处理代码。

  • 使用自上而下的设计(也称为逐步细化)来限制您在任何给定时间必须处理的需求的复杂性
    如果您使用这种方法,您会发现模块的可执行部分更短且更容易理解,这使得您的代码随着时间的推移更容易维护和增强。 使用本地或嵌套的模块对于遵循这一设计原则起着关键作用。

这些只是在开始编写所有代码之前需要记住的一些重要事项。 请记住:在软件开发的世界中,仓促不仅会造成浪费,而且实际上会导致大量的错误和损失的周末。

不要害怕寻求帮助

软件专业人士通常很聪明。 不幸的是,您的成功也可以使您保持自负,自大和不愿意在您感到困惑时寻求帮助。 这种趋势是软件开发中最危险和最具破坏性的方面之一。

软件由人类撰写; 因此,重要的是要认识到人类心理学在软件开发中起着关键作用。

诸如“我为什么不看到的?”以及“如果我多花五分钟时间自己调试,我会发现它” 的想法是可以理解的,但也很愚钝(thick-headed)。 最重要的是,我们通常无法识别自己的问题,因为我们离我们自己的代码太近了。 有时,我们所需要的只是一个新的视角,这是一个无所事事的人的相对客观观点。 它与资历,专业知识或能力无关。

我们强烈建议您在组织中制定以下准则:

  • 奖励承认无知
    隐藏您不了解的应用程序或其代码是非常危险的。 培养一种欢迎提问和请求帮助的文化。

  • 请求帮忙
    如果您无法在 30 分钟内找出错误来源,请立即寻求帮助。 你甚至可以建立一个“伙伴系统”,这样每个人都会被分配一个需要寻求帮助的人。 不要让自己(或团队中的其他人)花费数小时以头撞墙,徒劳地寻找答案。

  • 建立正式的同行代码审查流程
    不要让任何代码在没有被团队中的一名或多名其他开发人员阅读和批评(以积极、建设性的方式)的情况下进入质量检查或生产阶段。

采取创造性甚至激进的方法

我们几乎在生活的各个方面都容易陷入墨守成规的境地。 人是习惯的生物:你学会用一种方式编写代码;您假设产品存在某些限制; 你没有认真检查就放弃了可能的解决方案,因为你觉得这是不可能的。 开发人员对自己的程序产生了彻头彻尾的偏见,而且通常不是以积极的方式。 人们经常听到他们说这样的话:

  • “它不能跑得比这更快了; 这是一头猪。”
  • “我无法让它按照用户想要的方式工作; 那得等下一个版本了。”
  • “如果我使用 X 或 Y 或 Z 产品,那就轻而易举了。 但有了这些东西,一切都变得很困难。”

但现实是你的程序几乎总是可以运行得更快一点。 你需要打破你顽固观点的限制,以全新的眼光看待世界。 重新评估您养成的编程习惯。 发挥创造力——远离传统方法,远离我们业务场所不断强化的往往有限的机械方法。

尝试一些新的东西:尝试一些看似完全背离常态的东西。 作为一名程序员和问题解决者,你会惊讶地发现自己能学到很多东西,成长得也很多。 多年来,当我不再说“你做不到”时,我一次又一次地惊讶于自己真正可以实现的目标。

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值