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
...
BEGINSELECT ...
...UPDATE ...
END;

控制和条件逻辑

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

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

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

-- 创建存储过程
CREATE OR REPLACE PROCEDURE conditional_procedure (p_input_parameter IN NUMBER
) ASv_output_message VARCHAR2(100);
BEGIN-- 使用条件判断执行不同的逻辑IF p_input_parameter > 0 THENv_output_message := 'Input parameter is positive.';ELSIF p_input_parameter = 0 THENv_output_message := 'Input parameter is zero.';ELSEv_output_message := 'Input parameter is negative.';END IF;-- 打印输出信息DBMS_OUTPUT.PUT_LINE(v_output_message);
END conditional_procedure;
/-- 调用存储过程
DECLAREv_input_param NUMBER := 10;
BEGINconditional_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 THENDBMS_OUTPUT.PUT_LINE('Input parameter is positive.');ELSIF p_input_parameter = 0 THENDBMS_OUTPUT.PUT_LINE('Input parameter is zero.');ELSE-- 抛出自定义异常RAISE custom_exception;END IF;EXCEPTION-- 捕获自定义异常WHEN custom_exception THENDBMS_OUTPUT.PUT_LINE('Input parameter is negative. Custom Exception Raised.');-- 捕获其他异常WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END custom_exception_procedure;
/-- 调用存储过程
DECLAREv_input_param NUMBER := -5;
BEGINcustom_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

  • PL/SQL Obsession
  • oracle-developer.net
  • OTN PL/SQL page
  • ORACLE-BASE

一些建议

别太着急!

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

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

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

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

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

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

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

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

不要害怕寻求帮助

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

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

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

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

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

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTPS协议

文章目录 RTPS(Real-time Publish-Subscribe Protocol)RTPS(Real-time Publish-Subscribe Protocol) RTPS(Real-time Publish-Subscribe Protocol)是一种基于发布/订阅模型的协议,用于实时数据分发。它是 OMG 组织定义的标准协议,用于支持分布式实时系统中的数据分发和…

打开 IOS开发者模式

前言 需要 1、辅助设备:苹果电脑; 2、辅助应用:Xcode; 3、准备工作:苹果手机 使用数据线连接 苹果电脑; 当前系统版本 IOS 17.3 通过Xcode激活 两指同时点击 Xcode 显示选择,Open Develop…

重生奇迹MU平民玩家推荐的职业

女魔法师 女魔法师是一个非常适合平民玩家的职业选择。她拥有着强大的魔法攻击能力,可以轻松地击败敌人。而且女魔法师的装备价格相对较低,适合玩家们的经济实力。 精灵射手 精灵射手是一个非常灵活的职业选择。他们可以远程攻击,可以在战…

go-carbon v2.3.7 发布,轻量级、语义化、对开发者友好的 golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。 目前已被 awesome-go 收录,如果您觉得不错,请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…

Markdown语法简介

Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。Markdown文件通常以.md或.markdown为后缀。这篇博文将介绍Markdown的一些基本语法,帮助您快速上手。 标题 在Markdown中,您可以通过在文本前面添加#符号来创建标…

使用PCL进行法向量可视化

使用PCL进行法向量可视化 文章目录 1、使用PCL进行法向量可视化2、计算所有点的法线并显示3、计算一个子集的法线 1、使用PCL进行法向量可视化 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> #include &l…

element plus使用问题

文章目录 element plusvue.config.js注意1、有时候会报错 not a function2、使用 ElMessage 报错3、 element plus 版本过高4、警告Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined.5、报错 ResizeObserver loop completed with undelivered noti…

Redis高级应用

文章目录 1.5.1 布隆过滤器BloomFilter1.5.1.1 原理1.5.1.2 使用场景 1.5.2 Redis分布式锁1.5.2.1 使用案例分析1.5.2.1.1 单机版没加锁1.5.2.1.2 单节点Redis实现分布式锁1.5.2.1.3 集群下的分布式及CAP1.5.2.1.4 Redisson可靠分布式锁1.5.2.1.5 Redis分布式锁-Redlock算法1.5…

Linux之进程间通信(system V 共享内存)

目录 一、共享内存 1、基本原理 2、共享内存的创建 3、共享内存的释放 4、共享内存的关联 5、共享内存的去关联 6、查看IPC资源 二、完整通信代码 三、共享内存的特点 四、信号量 1、相关概念 2、信号量概念 进程间通信的本质就是让不同的进程看到同一个资源。而前…

微信小程序(二十)Vant组件库的配置

教程很详细&#xff0c;直接上过程 上一篇 官方文档也有&#xff0c;但是因为版本的更新&#xff0c;官方文档并没有跟着改变&#xff0c;这里我写一份最新版能用的教程 &#xff08;口头禅还是不能少的&#x1f923;&#x1f923;&#x1f923;&#xff09; 灵魂拷问&#xf…

Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart

每次提交代码时&#xff0c;AS这个老妈子总爱唠叨一堆warning&#xff0c;这些Warning都在讲什么&#xff1f; 1.Use app:drawableStartCompat instead of android:drawableStart 在Android开发中&#xff0c;android:drawableStart和app:drawableStartCompat是两个用于设置…

基于YOLOv8的摄像头吸烟行为检测系统(Python源码+Pyqt6界面+数据集)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了摄像头下吸烟行为检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Pytorch的源码、训练数据集以及PyQt6的UI界面。在界面中可以选择各种图片、视频进行检测识别&#xff0c;可进行置信度、Iou阈值设定…

智能分析网关V4智慧冶金工厂视频智能监管方案

一、背景与需求 随着工业4.0的推进&#xff0c;冶金行业正面临着转型升级的压力。为了提高生产效率、降低能耗、保障安全&#xff0c;冶金智能工厂视频监管方案应运而生。该方案通过高清摄像头、智能分析技术、大数据处理等手段&#xff0c;对工厂进行全方位、实时监控&#xf…

详细解读vcruntime140_1.dll修复的手段,如何快速解决vcruntime140_1.dll丢失问题

当出现“无法找到vcruntime140_1.dll”或程序“未能正常启动”时&#xff0c;这通常指示系统中缺失了一个关键文件&#xff1a;vcruntime140_1.dll。作为Visual C Redistributable组件的一部分&#xff0c;这个小文件在很多用Visual Studio编译的C程序运行时发挥着重要作用。解…

2024/1/27 备战蓝桥杯 1-2

目录 金币 0金币 - 蓝桥云课 (lanqiao.cn) 天干地支 0天干地支 - 蓝桥云课 (lanqiao.cn) 明明的随机数 0明明的随机数 - 蓝桥云课 (lanqiao.cn) 浇灌 0灌溉 - 蓝桥云课 (lanqiao.cn) 金币 0金币 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a;放两种情况&#xff08;k:代…

Qslog开源库使用

Qslog源码下载地址&#xff1a;https://github.com/victronenergy/QsLog 1.QSLOG使用方式 &#xff08;1&#xff09;源码集成 在你的工程中&#xff0c;直接包含QsLog.pri文件&#xff0c;进行源码集成。当然你也可以包含QsLog.pri后&#xff0c;编译为xx.dll&#xff0c;在…

MVCC原理讲解(深入浅出)

目录 一、什么是MVCC 二、当前读、快照读都是什么鬼 三、当前读 四、快照读 五、数据库的并发场景 六、MVCC解决并发的哪些问题 1.解决问题如下&#xff1a; 七、MVCC的实现原理 1.版本链 八、undo日志 1.undo log 的用途 2.undo log主要分为两种 九、Read View…

简洁思路推理 KMP 算法——子字符串匹配

例题 28. 找出字符串中第一个匹配项的下标 暴力遍历解法 枚举原串 ss 中的每个字符作为「发起点」&#xff0c;每次从原串的「发起点」和匹配串的「首位」开始尝试匹配&#xff1a; 匹配成功&#xff1a;返回本次匹配的原串「发起点」。 匹配失败&#xff1a;枚举原串的下一个…

UI自动化搭建背景及优劣势分析

经常有人会问&#xff0c;什么样的项目才适合进行UI自动化测试呢&#xff1f;UI自动化测试相当于模拟手工测试&#xff0c;通过程序去操作页面上的控件。而在实际测试过程中&#xff0c;经常会遇到无法找到控件&#xff0c;或者因控件定义变更而带来的维护成本等问题。 哪些场…

制作圆形Image

思路 绘制圆 &#xff0c;使用多个三角形组合在一起近似一个圆单位圆上的点使用(Cosx&#xff0c;Sinx)表示sprite的uv映射到单位圆上 点到UV的映射规律 Sprite的外部uv 为 (x y z w ) 原点为 (x,y) 宽度为z-x 高度为w-y 单位圆上的点为(CosA&#xff0c;SinA) uv坐标 (x,y…