- PL/SQL 教程
- PL/SQL - 主页
- PL/SQL - 概述
- PL/SQL - 环境
- PL/SQL - 基本语法
- PL/SQL - 数据类型
- PL/SQL - 变量
- PL/SQL - 常量和文字
- PL/SQL - 运算符
- PL/SQL - 条件
- PL/SQL - 循环
- PL/SQL - 字符串
- PL/SQL - 数组
- PL/SQL - 过程
- PL/SQL - 函数
- PL/SQL - 游标
- PL/SQL - 记录
- PL/SQL - 异常
- PL/SQL - 触发器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事务
- PL/SQL - 日期和时间
- PL/SQL - DBMS 输出
- PL/SQL - 面向对象
- PL/SQL 有用资源
- PL/SQL - 问题与解答
- PL/SQL - 快速指南
- PL/SQL - 有用的资源
- PL/SQL - 讨论
PL/SQL - 快速指南
PL/SQL - 概述
PL/SQL 编程语言是 Oracle 公司在 20 世纪 80 年代末开发的,作为 SQL 和 Oracle 关系数据库的过程扩展语言。以下是有关 PL/SQL 的一些值得注意的事实 -
PL/SQL 是一种完全可移植的高性能事务处理语言。
PL/SQL 提供了一个内置的、解释性的、独立于操作系统的编程环境。
PL/SQL 也可以直接从命令行SQL*Plus 界面调用。
也可以从外部编程语言调用数据库直接调用。
PL/SQL 的通用语法基于 ADA 和 Pascal 编程语言。
除了 Oracle 之外,TimesTen 内存数据库和IBM DB2中也提供了 PL/SQL 。
PL/SQL 的特点
PL/SQL 具有以下功能 -
- PL/SQL 与 SQL 紧密集成。
- 它提供广泛的错误检查。
- 它提供了多种数据类型。
- 它提供了多种编程结构。
- 它支持通过函数和过程进行结构化编程。
- 它支持面向对象编程。
- 它支持 Web 应用程序和服务器页面的开发。
PL/SQL 的优点
PL/SQL 具有以下优点 -
SQL 是标准数据库语言,PL/SQL 与 SQL 紧密集成。PL/SQL 支持静态和动态 SQL。静态SQL支持来自PL/SQL块的DML操作和事务控制。在动态 SQL 中,SQL 允许在 PL/SQL 块中嵌入 DDL 语句。
PL/SQL 允许一次将整个语句块发送到数据库。这减少了网络流量并为应用程序提供了高性能。
PL/SQL 为程序员提供了高生产力,因为它可以查询、转换和更新数据库中的数据。
PL/SQL 通过异常处理、封装、数据隐藏和面向对象的数据类型等强大功能节省了设计和调试时间。
用 PL/SQL 编写的应用程序是完全可移植的。
PL/SQL 提供高安全级别。
PL/SQL 提供对预定义 SQL 包的访问。
PL/SQL 提供对面向对象编程的支持。
PL/SQL 为开发 Web 应用程序和服务器页面提供支持。
PL/SQL - 环境设置
在本章中,我们将讨论 PL/SQL 的环境设置。PL/SQL 不是一种独立的编程语言;它是 Oracle 编程环境中的一个工具。SQL* Plus是一个交互式工具,允许您在命令提示符下键入 SQL 和 PL/SQL 语句。然后这些命令被发送到数据库进行处理。处理完报表后,结果将被发送回并显示在屏幕上。
要运行 PL/SQL 程序,您应该在计算机上安装 Oracle RDBMS 服务器。这将负责 SQL 命令的执行。Oracle RDBMS 的最新版本是 11g。您可以从以下链接下载 Oracle 11g 的试用版 -
您必须根据您的操作系统下载 32 位或 64 位版本的安装。通常有两个文件。我们已经下载了64位版本。您还将在您的操作系统上使用类似的步骤,无论是 Linux 还是 Solaris。
win64_11gR2_database_1of2.zip
win64_11gR2_database_2of2.zip
下载上述两个文件后,您需要将它们解压缩到一个目录数据库中,在该目录下您将找到以下子目录 -
步骤1
现在让我们使用安装文件启动 Oracle 数据库安装程序。以下是第一个屏幕。您可以提供您的电子邮件 ID 并选中复选框,如以下屏幕截图所示。单击下一步按钮。
第2步
您将被引导至以下屏幕;取消选中该复选框并单击继续按钮继续。
步骤3
只需使用单选按钮选择第一个选项“创建和配置数据库” ,然后单击“下一步”按钮即可继续。
步骤4
我们假设您安装 Oracle 的基本目的是为了学习,并且将其安装在您的 PC 或笔记本电脑上。因此,选择“桌面类”选项并单击“下一步”按钮继续。
步骤5
提供一个位置,您将在其中安装 Oracle 服务器。只需修改Oracle Base,其他位置就会自动设置。您还必须提供密码;这将由系统 DBA 使用。提供所需信息后,单击“下一步”按钮继续。
步骤6
再次单击“下一步”按钮继续。
步骤7
单击“完成”按钮继续;这将开始实际的服务器安装。
步骤8
这将需要一些时间,直到 Oracle 开始执行所需的配置。
步骤9
在这里,Oracle安装将复制所需的配置文件。这应该需要一些时间 -
步骤10
复制数据库文件后,您将看到以下对话框。只要点击确定按钮就可以出来了。
第11步
安装后,您将看到以下最终窗口。
最后一步
现在是时候验证您的安装了。如果您使用的是 Windows,请在命令提示符下使用以下命令 -
sqlplus "/ as sysdba"
您应该有 SQL 提示符,您可以在其中编写 PL/SQL 命令和脚本 -
文本编辑器
从命令提示符运行大型程序可能会让您无意中丢失一些工作。始终建议使用命令文件。使用命令文件 -
在文本编辑器中键入代码,例如Notepad、Notepad+或EditPlus等。
将扩展名为.sql的文件保存在主目录中。
从创建 PL/SQL 文件的目录启动SQL*Plus 命令提示符。
在 SQL*Plus 命令提示符处键入@file_name以执行程序。
如果您没有使用文件来执行 PL/SQL 脚本,则只需复制您的 PL/SQL 代码并右键单击显示 SQL 提示符的黑色窗口即可;使用粘贴选项在命令提示符下粘贴完整的代码。最后,如果代码尚未执行,只需按Enter即可执行。
PL/SQL - 基本语法
在本章中,我们将讨论块结构语言PL/SQL的基本语法;这意味着 PL/SQL 程序被划分并以逻辑代码块编写。每个块由三个子部分组成 -
序列号 | 章节和描述 |
---|---|
1 |
声明 本节以关键字DECLARE开始。它是一个可选部分,定义了程序中使用的所有变量、游标、子程序和其他元素。 |
2 |
可执行命令 该部分包含在关键字BEGIN和END之间,是强制部分。它由程序的可执行PL/SQL 语句组成。它应该至少有一行可执行代码,这可能只是一个NULL 命令,表示不应该执行任何操作。 |
3 | 异常处理 本节以关键字EXCEPTION开始。此可选部分包含处理程序中错误的异常。 |
每个 PL/SQL 语句都以分号 (;) 结尾。PL/SQL 块可以使用BEGIN和END嵌套在其他 PL/SQL 块中。以下是 PL/SQL 块的基本结构 -
DECLARE <declarations section> BEGIN <executable command(s)> EXCEPTION <exception handling> END;
“Hello World”示例
DECLARE message varchar2(20):= 'Hello, World!'; BEGIN dbms_output.put_line(message); END; /
结束;行表示 PL/SQL 块的结束。要从 SQL 命令行运行代码,您可能需要在代码最后一行之后的第一个空行的开头键入 /。当上面的代码在 SQL 提示符下执行时,会产生以下结果 -
Hello World PL/SQL procedure successfully completed.
PL/SQL 标识符
PL/SQL 标识符是常量、变量、异常、过程、游标和保留字。标识符由一个字母组成(可选后跟更多字母、数字、美元符号、下划线和数字符号),并且不应超过 30 个字符。
默认情况下,标识符不区分大小写。因此可以使用整数或INTEGER来表示数值。您不能使用保留关键字作为标识符。
PL/SQL 分隔符
分隔符是具有特殊含义的符号。以下是 PL/SQL 中的分隔符列表 -
分隔符 | 描述 |
---|---|
+、-、*、/ | 加法、减法/求反、乘法、除法 |
% | 属性指标 |
' | 字符串分隔符 |
。 | 组件选择器 |
(,) | 表达式或列表分隔符 |
: | 宿主变量指示器 |
, | 项目分隔符 |
” | 带引号的标识符分隔符 |
= | 关系运算符 |
@ | 远程访问指示灯 |
; | 语句终止符 |
:= | 赋值运算符 |
=> | 协会运营商 |
|| | 串联运算符 |
** | 求幂运算符 |
<<,>> | 标签分隔符(开始和结束) |
/*, */ | 多行注释分隔符(开始和结束) |
-- | 单行评论指示器 |
.. | 范围运算符 |
<、>、<=、>= | 关系运算符 |
<>、'=、~=、^= | NOT EQUAL 的不同版本 |
PL/SQL 注释
程序注释是解释性语句,可以包含在您编写的 PL/SQL 代码中,并帮助任何人阅读其源代码。所有编程语言都允许某种形式的注释。
PL/SQL 支持单行和多行注释。PL/SQL 编译器将忽略任何注释中可用的所有字符。PL/SQL 单行注释以分隔符 --(双连字符)开头,多行注释由 /* 和 */ 括起来。
DECLARE -- variable declaration message varchar2(20):= 'Hello, World!'; BEGIN /* * PL/SQL executable statement(s) */ dbms_output.put_line(message); END; /
当上面的代码在 SQL 提示符下执行时,会产生以下结果 -
Hello World PL/SQL procedure successfully completed.
PL/SQL 程序单元
PL/SQL 单元是以下任意一种 -
- PL/SQL 块
- 功能
- 包裹
- 封装体
- 程序
- 扳机
- 类型
- 型体
每个单元都将在以下章节中讨论。
PL/SQL - 数据类型
在本章中,我们将讨论 PL/SQL 中的数据类型。PL/SQL 变量、常量和参数必须具有有效的数据类型,该数据类型指定存储格式、约束和有效值范围。本章我们将重点关注SCALAR和LOB数据类型。其他两种数据类型将在其他章节中介绍。
序列号 | 类别及描述 |
---|---|
1 | 标量 没有内部组件的单个值,例如NUMBER、DATE或BOOLEAN。 |
2 | 大对象 (LOB) 指向与其他数据项分开存储的大对象的指针,例如文本、图形图像、视频剪辑和声音波形。 |
3 | 合成的 具有可单独访问的内部组件的数据项。例如,收藏和记录。 |
4 | 参考 指向其他数据项的指针。 |
PL/SQL 标量数据类型和子类型
PL/SQL 标量数据类型和子类型属于以下类别 -
序列号 | 日期类型和描述 |
---|---|
1 | 数字 对其执行算术运算的数值。 |
2 | 特点 表示单个字符或字符串的字母数字值。 |
3 | 布尔值 对其执行逻辑运算的逻辑值。 |
4 | 约会时间 日期和时间。 |
PL/SQL 提供数据类型的子类型。例如,数据类型 NUMBER 有一个名为 INTEGER 的子类型。您可以使用 PL/SQL 程序中的子类型使数据类型与其他程序中的数据类型兼容,同时将 PL/SQL 代码嵌入到另一个程序(例如 Java 程序)中。
PL/SQL 数字数据类型和子类型
下表列出了 PL/SQL 预定义的数值数据类型及其子类型 -
序列号 | 数据类型和描述 |
---|---|
1 | PLS_INTEGER 范围为 -2,147,483,648 到 2,147,483,647 的有符号整数,以 32 位表示 |
2 | BINARY_INTEGER 范围为 -2,147,483,648 到 2,147,483,647 的有符号整数,以 32 位表示 |
3 | BINARY_FLOAT 单精度 IEEE 754 格式浮点数 |
4 | BINARY_DOUBLE 双精度 IEEE 754 格式浮点数 |
5 | 数字(精度,比例) 绝对值在 1E-130 到(但不包括)1.0E126 范围内的定点或浮点数。NUMBER 变量也可以表示 0 |
6 | DEC(精度,比例) ANSI 特定定点类型,最大精度为 38 位十进制数字 |
7 | DECIMAL(精度,小数位数) IBM 特定定点类型,最大精度为 38 位十进制数字 |
8 | 数字(前、后) 浮点型,最大精度为 38 位小数 |
9 | 双精度 ANSI 特定浮点类型,最大精度为 126 位二进制数字(大约 38 位十进制数字) |
10 | 漂浮 ANSI 和 IBM 特定浮点类型,最大精度为 126 位二进制数字(大约 38 位十进制数字) |
11 | INT ANSI 特定整数类型,最大精度为 38 位十进制数字 |
12 | 整数 ANSI 和 IBM 特定整数类型,最大精度为 38 位十进制数字 |
13 | 小智 ANSI 和 IBM 特定整数类型,最大精度为 38 位十进制数字 |
14 | 真实的 浮点型,最大精度为 63 位二进制数(约 18 位十进制数) |
以下是有效的声明 -
DECLARE num1 INTEGER; num2 REAL; num3 DOUBLE PRECISION; BEGIN null; END; /
当上面的代码被编译并执行时,它会产生以下结果 -
PL/SQL procedure successfully completed
PL/SQL 字符数据类型和子类型
以下是 PL/SQL 预定义字符数据类型及其子类型的详细信息 -
序列号 | 数据类型和描述 |
---|---|
1 | 字符 定长字符串,最大长度为32,767字节 |
2 | VARCHAR2 可变长度字符串,最大长度为 32,767 字节 |
3 | 生的 可变长度二进制或字节字符串,最大大小为 32,767 字节,不由 PL/SQL 解释 |
4 | NCHAR 固定长度的国家字符串,最大长度为 32,767 字节 |
5 | NVARCHAR2 变长国家字符串,最大长度为 32,767 字节 |
6 | 长的 可变长度字符串,最大长度为 32,760 字节 |
7 | 长生 可变长度二进制或字节字符串,最大大小为 32,760 字节,不由 PL/SQL 解释 |
8 | 行ID 物理行标识符,普通表中的行的地址 |
9 | 乌鲁维德 通用行标识符(物理、逻辑或外部行标识符) |
PL/SQL 布尔数据类型
BOOLEAN数据类型存储逻辑运算中使用的逻辑值。逻辑值是布尔值TRUE和FALSE以及值NULL。
但是,SQL 没有与 BOOLEAN 等效的数据类型。因此,布尔值不能用于 -
- SQL语句
- 内置 SQL 函数(例如TO_CHAR)
- 从 SQL 语句调用 PL/SQL 函数
PL/SQL 日期时间和间隔类型
DATE数据类型用于存储固定长度的日期时间,其中包括自午夜以来以秒为单位的时间。有效日期范围为公元前4712年1月1日至公元9999年12月31日。
默认日期格式由Oracle初始化参数NLS_DATE_FORMAT设置。例如,默认值可能是“DD-MON-YY”,其中包括表示月份中日期的两位数字、月份名称的缩写以及年份的最后两位数字。例如,2012 年 10 月 1 日。
每个 DATE 包括世纪、年、月、日、小时、分钟和秒。下表显示了每个字段的有效值 -
字段名称 | 有效日期时间值 | 有效间隔值 |
---|---|---|
年 | -4712 至 9999(不包括 0 年) | 任何非零整数 |
月 | 01 至 12 | 0 至 11 |
天 | 01 到 31(受 MONTH 和 YEAR 值的限制,根据区域设置的日历规则) | 任何非零整数 |
小时 | 00 至 23 | 0 至 23 |
分钟 | 00 至 59 | 0 至 59 |
第二 | 00 到 59.9(n),其中 9(n) 是时间小数秒的精度 | 0 到 59.9(n),其中 9(n) 是间隔小数秒的精度 |
TIMEZONE_HOUR | -12 至 14(范围适应夏令时变化) | 不适用 |
TIMEZONE_MINUTE | 00 至 59 | 不适用 |
TIMEZONE_REGION | 在动态性能视图V$TIMEZONE_NAMES中找到 | 不适用 |
TIMEZONE_ABBR | 在动态性能视图V$TIMEZONE_NAMES中找到 | 不适用 |
PL/SQL 大对象 (LOB) 数据类型
大对象 (LOB) 数据类型是指文本、图形图像、视频剪辑和声音波形等大数据项。LOB 数据类型允许高效、随机、分段地访问该数据。以下是预定义的 PL/SQL LOB 数据类型 -
数据类型 | 描述 | 尺寸 |
---|---|---|
B文件 | 用于在数据库外部存储操作系统文件中的大型二进制对象。 | 取决于系统。不能超过 4 GB。 |
BLOB | 用于在数据库中存储大型二进制对象。 | 8 至 128 太字节 (TB) |
CLOB | 用于在数据库中存储大块字符数据。 | 8 至 128 TB |
NCLOB | 用于在数据库中存储大块的NCHAR数据。 | 8 至 128 TB |
PL/SQL 用户定义的子类型
子类型是另一种数据类型的子集,称为其基本类型。子类型与其基类型具有相同的有效操作,但只有其有效值的子集。
PL/SQL 在STANDARD包中预定义了几个子类型。例如,PL/SQL 预定义了子类型CHARACTER和INTEGER,如下所示 -
SUBTYPE CHARACTER IS CHAR; SUBTYPE INTEGER IS NUMBER(38,0);
您可以定义和使用自己的子类型。以下程序说明了定义和使用用户定义的子类型 -
DECLARE SUBTYPE name IS char(20); SUBTYPE message IS varchar2(100); salutation name; greetings message; BEGIN salutation := 'Reader '; greetings := 'Welcome to the World of PL/SQL'; dbms_output.put_line('Hello ' || salutation || greetings); END; /
当上面的代码在 SQL 提示符下执行时,会产生以下结果 -
Hello Reader Welcome to the World of PL/SQL PL/SQL procedure successfully completed.
PL/SQL 中的 NULL
PL/SQL NULL 值表示丢失或未知的数据,它们不是整数、字符或任何其他特定数据类型。请注意,NULL与空数据字符串或空字符值'\0'不同。null 可以被赋值,但不能等同于任何东西,包括它本身。
PL/SQL - 变量
在本章中,我们将讨论 Pl/SQL 中的变量。变量只不过是我们的程序可以操作的存储区域的名称。PL/SQL中的每个变量都有一个特定的数据类型,它决定了变量内存的大小和布局;可以存储在该内存中的值的范围以及可以应用于变量的操作集。
PL/SQL 变量的名称由一个字母组成(可选地后跟更多字母、数字、美元符号、下划线和数字符号),并且不应超过 30 个字符。默认情况下,变量名称不区分大小写。不能使用保留的 PL/SQL 关键字作为变量名。
PL/SQL 编程语言允许定义各种类型的变量,例如日期时间数据类型、记录、集合等,我们将在后续章节中介绍。在本章中,我们只研究基本变量类型。
PL/SQL 中的变量声明
PL/SQL 变量必须在声明部分或包中声明为全局变量。当声明变量时,PL/SQL 会为变量的值分配内存,并且存储位置由变量名称标识。
声明变量的语法是 -
variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]
其中,variable_name是 PL/SQL 中的有效标识符,datatype必须是有效的 PL/SQL 数据类型或我们在上一章中已经讨论过的任何用户定义的数据类型。一些有效的变量声明及其定义如下所示 -
sales number(10, 2); pi CONSTANT double precision := 3.1415; name varchar2(25); address varchar2(100);
当您提供数据类型的大小、小数位数或精度限制时,称为约束声明。受约束的声明比不受约束的声明需要更少的内存。例如 -
sales number(10, 2); name varchar2(25); address varchar2(100);
在 PL/SQL 中初始化变量
每当声明变量时,PL/SQL 都会为其分配默认值 NULL。如果要使用 NULL 值以外的值初始化变量,可以在声明期间使用以下任一方法执行此操作 -
DEFAULT关键字_
赋值运算符
例如 -
counter binary_integer := 0; greetings varchar2(20) DEFAULT 'Have a Good Day';
您还可以使用NOT NULL约束指定变量不应具有NULL值。如果使用 NOT NULL 约束,则必须显式为该变量分配初始值。
正确初始化变量是一个很好的编程习惯,否则有时程序会产生意外的结果。尝试以下使用各种类型变量的示例 -
DECLARE a integer := 10; b integer := 20; c integer; f real; BEGIN c := a + b; dbms_output.put_line('Value of c: ' || c); f := 70.0/3.0; dbms_output.put_line('Value of f: ' || f); END; /
执行上述代码时,会产生以下结果 -
Value of c: 30 Value of f: 23.333333333333333333 PL/SQL procedure successfully completed.
PL/SQL 中的变量作用域
PL/SQL允许块的嵌套,即每个程序块可以包含另一个内部块。如果变量是在内部块中声明的,则外部块无法访问该变量。但是,如果声明了一个变量并且外部块可以访问该变量,那么所有嵌套的内部块也可以访问该变量。有两种类型的变量范围 -
局部变量- 在内部块中声明的变量,外部块无法访问。
全局变量- 在最外层块或包中声明的变量。
以下示例以简单形式显示了局部变量和全局变量的用法-
DECLARE -- Global variables num1 number := 95; num2 number := 85; BEGIN dbms_output.put_line('Outer Variable num1: ' || num1); dbms_output.put_line('Outer Variable num2: ' || num2); DECLARE -- Local variables num1 number := 195; num2 number := 185; BEGIN dbms_output.put_line('Inner Variable num1: ' || num1); dbms_output.put_line('Inner Variable num2: ' || num2); END; END; /
执行上述代码时,会产生以下结果 -
Outer Variable num1: 95 Outer Variable num2: 85 Inner Variable num1: 195 Inner Variable num2: 185 PL/SQL procedure successfully completed.
将 SQL 查询结果分配给 PL/SQL 变量
您可以使用SQL 的SELECT INTO语句为 PL/SQL 变量赋值。对于SELECT 列表中的每一项, INTO 列表中必须有一个相应的、类型兼容的变量。下面的例子说明了这个概念。让我们创建一个名为 CUSTOMERS 的表 -
(SQL语句请参考SQL教程)
CREATE TABLE CUSTOMERS( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) ); Table Created
现在让我们在表中插入一些值 -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'kaushik', 23, 'Kota', 2000.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (6, 'Komal', 22, 'MP', 4500.00 );
以下程序使用SQL 的SELECT INTO 子句将上表中的值分配给 PL/SQL 变量 -
DECLARE c_id customers.id%type := 1; c_name customers.name%type; c_addr customers.address%type; c_sal customers.salary%type; BEGIN SELECT name, address, salary INTO c_name, c_addr, c_sal FROM customers WHERE id = c_id; dbms_output.put_line ('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal); END; /
执行上述代码时,会产生以下结果 -
Customer Ramesh from Ahmedabad earns 2000 PL/SQL procedure completed successfully
PL/SQL - 常量和文字
在本章中,我们将讨论PL/SQL 中的常量和文字。常量保存的值一旦声明,就不会在程序中更改。常量声明指定其名称、数据类型和值,并为其分配存储空间。该声明还可以施加NOT NULL 约束。
声明一个常量
常量是使用CONSTANT关键字声明的。它需要一个初始值并且不允许更改该值。例如 -
PI CONSTANT NUMBER := 3.141592654; DECLARE -- constant declaration pi constant number := 3.141592654; -- other declarations radius number(5,2); dia number(5,2); circumference number(7, 2); area number (10, 2); BEGIN -- processing radius := 9.5; dia := radius * 2; circumference := 2.0 * pi * radius; area := pi * radius * radius; -- output dbms_output.put_line('Radius: ' || radius); dbms_output.put_line('Diameter: ' || dia); dbms_output.put_line('Circumference: ' || circumference); dbms_output.put_line('Area: ' || area); END; /
当上面的代码在 SQL 提示符下执行时,会产生以下结果 -
Radius: 9.5 Diameter: 19 Circumference: 59.69 Area: 283.53 Pl/SQL procedure successfully completed.
PL/SQL 文字
文字是不由标识符表示的显式数字、字符、字符串或布尔值。例如,TRUE、786、NULL、'tutorialspoint' 都是布尔类型、数字或字符串类型的文字。PL/SQL,文字区分大小写。PL/SQL 支持以下类型的文字 -
- 数字文字
- 字符文字
- 字符串文字
- 布尔文字
- 日期和时间文字
下表提供了所有这些类别的文字值的示例。
序列号 | 文字类型和示例 |
---|---|
1 | 数字文字 050 78 -14 0 +32767 6.6667 0.0 -12.0 3.14159 +7800.00 6E5 1.0E-8 3.14159e0 -1E38 -9.5e-3 |
2 | 字符文字 'A' '%' '9' ' ' z' '(' |
3 | 字符串文字 '你好世界!' “教程点” “2012 年 11 月 19 日” |
4 | 布尔文字 TRUE、FALSE 和 NULL。 |
5 | 日期和时间文字 日期 '1978-12-25'; 时间戳 '2012-10-29 12:01:01'; |
要在字符串文字中嵌入单引号,请将两个单引号彼此相邻放置,如以下程序所示 -
DECLARE message varchar2(30):= 'That''s tutorialspoint.com!'; BEGIN dbms_output.put_line(message); END; /
当上面的代码在 SQL 提示符下执行时,会产生以下结果 -
That's tutorialspoint.com! PL/SQL procedure successfully completed.
PL/SQL - 运算符
在本章中,我们将讨论 PL/SQL 中的运算符。运算符是告诉编译器执行特定数学或逻辑操作的符号。PL/SQL 语言具有丰富的内置运算符,并提供以下类型的运算符 -
- 算术运算符
- 关系运算符
- 比较运算符
- 逻辑运算符
- 字符串运算符
在这里,我们将算术运算符、关系运算符、比较运算符和逻辑运算符一一了解。字符串运算符将在后面的章节中讨论 - PL/SQL - 字符串。
算术运算符
下表显示了 PL/SQL 支持的所有算术运算符。假设变量 A为 10,变量 B为 5,则 -
操作员 | 描述 | 例子 |
---|---|---|
+ | 添加两个操作数 | A + B 将得到 15 |
- | 从第一个操作数中减去第二个操作数 | A - B 给出 5 |
* | 将两个操作数相乘 | A * B 将给出 50 |
/ | 分子除以分子 | A/B 给出 2 |
** | 求幂运算符,将一个操作数求另一操作数的幂 | A ** B 会给 100000 |
关系运算符
关系运算符比较两个表达式或值并返回布尔结果。下表显示了 PL/SQL 支持的所有关系运算符。假设变量 A为 10,变量 B为 20,则 -
操作员 | 描述 | 例子 |
---|---|---|
= | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A = B) 不正确。 |
!= <> 〜= |
检查两个操作数的值是否相等,如果值不相等则条件成立。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是,则条件为真。 | (A > B) 不正确。 |
< | 检查左操作数的值是否小于右操作数的值,如果是,则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。 | (A >= B) 不正确。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。 | (A <= B) 为真 |
比较运算符
比较运算符用于将一个表达式与另一个表达式进行比较。结果始终为TRUE、FALSE或NULL。
操作员 | 描述 | 例子 |
---|---|---|
喜欢 | LIKE 运算符将字符、字符串或 CLOB 值与模式进行比较,如果该值与模式匹配则返回 TRUE,如果不匹配则返回 FALSE。 | 如果“Zara Ali”如“Z% A_i”返回布尔值 true,而“Nuha Ali”如“Z% A_i”返回布尔值 false。 |
之间 | BETWEEN 运算符测试某个值是否位于指定范围内。x BETWEEN a AND b 表示 x >= a 且 x <= b。 | 如果 x = 10,则 5 到 20 之间的 x 返回 true,5 到 10 之间的 x 返回 true,11 到 20 之间的 x 返回 false。 |
在 | IN 运算符测试集成员资格。x IN(集合)意味着x等于集合的任何成员。 | 如果 x = 'm',则 x in ('a', 'b', 'c') 返回布尔值 false,但 x in ('m', 'n', 'o') 返回布尔值 true。 |
一片空白 | 如果 IS NULL 运算符的操作数为 NULL,则返回 BOOLEAN 值 TRUE;如果操作数不为 NULL,则返回 FALSE。涉及 NULL 值的比较始终会产生 NULL。 | 如果 x = 'm',则 'x is null' 返回布尔值 false。 |
逻辑运算符
下表显示了 PL/SQL 支持的逻辑运算符。所有这些运算符都处理布尔操作数并产生布尔结果。假设变量 A为 true,变量 B为 false,则 -
操作员 | 描述 | 例子 |
---|---|---|
和 | 称为逻辑与运算符。如果两个操作数都为 true,则条件为 true。 | (A 和 B)是错误的。 |
或者 | 称为逻辑或运算符。如果两个操作数中的任何一个为真,则条件为真。 | (A 或 B)为真。 |
不是 | 称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑 NOT 运算符会将其设为假。 | 不是(A 和 B)为真。 |
PL/SQL 运算符优先级
运算符优先级决定表达式中术语的分组。这会影响表达式的计算方式。某些运算符的优先级高于其他运算符;例如,乘法运算符的优先级高于加法运算符。
例如,x = 7 + 3 * 2;这里,x被分配为13 ,而不是 20 ,因为运算符 * 的优先级高于 + ,因此它首先与3*2相乘,然后添加到7。
在这里,优先级最高的运算符出现在表的顶部,优先级最低的运算符出现在底部。在表达式中,将首先计算优先级较高的运算符。
运算符的优先级如下:=、<、>、<=、>=、<>、!=、~=、^=、IS NULL、LIKE、BETWEEN、IN。
操作员 | 手术 |
---|---|
** | 求幂 |
+、- | 同一性、否定性 |
*, / | 乘法、除法 |
+、-、|| | 加法、减法、连接 |
比较 | |
不是 | 逻辑否定 |
和 | 连词 |
或者 | 包容性 |
PL/SQL - 条件
在本章中,我们将讨论 PL/SQL 中的条件。决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及如果条件被确定为真则要执行的一条或多条语句,以及可选的如果条件成立则要执行的其他语句。条件被确定为假。
以下是大多数编程语言中典型条件(即决策)结构的一般形式 -
PL/SQL 编程语言提供以下类型的决策语句。单击以下链接查看其详细信息。
序列号 | 声明及说明 |
---|---|
1 | IF - THEN 语句
IF语句将条件与由关键字THEN和END IF括起来的语句序列相关联。如果条件为 true,则执行语句;如果条件为 false 或 NULL,则 IF 语句不执行任何操作。 |
2 | IF-THEN-ELSE 语句
IF 语句添加关键字ELSE,后跟替代语句序列。如果条件为 false 或 NULL,则仅执行备用语句序列。它确保执行任一语句序列。 |
3 | IF-THEN-ELSIF 语句
它允许您在多个选项之间进行选择。 |
4 | 案例陈述
与 IF 语句一样,CASE 语句选择一个语句序列来执行。 但是,为了选择序列,CASE 语句使用选择器而不是多个布尔表达式。选择器是一个表达式,其值用于选择多个替代项之一。 |
5 | 搜索CASE语句
搜索的 CASE 语句没有选择器,它的 WHEN 子句包含产生布尔值的搜索条件。 |
6 | 嵌套 IF-THEN-ELSE
您可以在另一个IF-THEN或IF-THEN-ELSIF语句中使用一个IF-THEN或IF-THEN-ELSIF语句。 |
PL/SQL - 循环
在本章中,我们将讨论 PL/SQL 中的循环。可能存在这样的情况:您需要多次执行一段代码。一般来说,语句是按顺序执行的:首先执行函数中的第一个语句,然后执行第二个语句,依此类推。
编程语言提供了各种控制结构,允许更复杂的执行路径。
循环语句允许我们多次执行一条语句或一组语句,以下是大多数编程语言中循环语句的一般形式 -
PL/SQL 提供以下类型的循环来处理循环要求。单击以下链接查看其详细信息。
序列号 | 循环类型和描述 |
---|---|
1 | PL/SQL 基本循环
在此循环结构中,语句序列包含在 LOOP 和 END LOOP 语句之间。在每次迭代中,都会执行语句序列,然后在循环顶部恢复控制。 |
2 | PL/SQL WHILE 循环
当给定条件为真时,重复一个语句或一组语句。它在执行循环体之前测试条件。 |
3 | PL/SQL FOR 循环
多次执行一系列语句并缩写管理循环变量的代码。 |
4 | PL/SQL 中的嵌套循环
您可以在任何其他基本循环、while 或 for 循环中使用一个或多个循环。 |
标记 PL/SQL 循环
PL/SQL 循环可以被标记。标签应该用双尖括号(<< 和 >>)括起来,并出现在 LOOP 语句的开头。标签名称也可以出现在 LOOP 语句的末尾。您可以使用 EXIT 语句中的标签退出循环。
以下程序说明了这个概念 -
DECLARE i number(1); j number(1); BEGIN << outer_loop >> FOR i IN 1..3 LOOP << inner_loop >> FOR j IN 1..3 LOOP dbms_output.put_line('i is: '|| i || ' and j is: ' || j); END loop inner_loop; END loop outer_loop; END; /
当上面的代码在 SQL 提示符下执行时,会产生以下结果 -
i is: 1 and j is: 1 i is: 1 and j is: 2 i is: 1 and j is: 3 i is: 2 and j is: 1 i is: 2 and j is: 2 i is: 2 and j is: 3 i is: 3 and j is: 1 i is: 3 and j is: 2 i is: 3 and j is: 3 PL/SQL procedure successfully completed.
循环控制语句
循环控制语句改变其正常顺序的执行。当执行离开作用域时,在该作用域中创建的所有自动对象都将被销毁。
PL/SQL 支持以下控制语句。标记循环还有助于将控制置于循环之外。单击以下链接查看其详细信息。
序列号 | 控制语句和描述 |
---|---|
1 | 退出语句
Exit 语句完成循环,控制权立即传递到 END LOOP 之后的语句。 |
2 | CONTINUE 语句
导致循环跳过其主体的其余部分并在重复之前立即重新测试其条件。 |
3 | GOTO 语句
将控制转移到带标签的语句。但不建议在程序中使用 GOTO 语句。 |
PL/SQL - 字符串
PL/SQL 中的字符串实际上是具有可选大小规范的字符序列。字符可以是数字、字母、空格、特殊字符或所有字符的组合。PL/SQL 提供三种字符串 -
固定长度字符串- 在此类字符串中,程序员在声明字符串时指定长度。该字符串在右侧用空格填充至指定的长度。
可变长度字符串- 在此类字符串中,指定字符串的最大长度可达 32,767,并且不会进行填充。
字符大对象 (CLOB) - 这些是可变长度字符串,最大可达 128 TB。
PL/SQL 字符串可以是变量或文字。字符串文字用引号引起来。例如,
'This is a string literal.' Or 'hello world'
要在字符串文字中包含单引号,您需要相邻键入两个单引号。例如,
'this isn''t what it looks like'
声明字符串变量
Oracle 数据库提供了多种字符串数据类型,例如 CHAR、NCHAR、VARCHAR2、NVARCHAR2、CLOB 和 NCLOB。以“N”为前缀的数据类型是“国家字符集”数据类型,用于存储 Unicode 字符数据。
如果需要声明可变长度字符串,则必须提供该字符串的最大长度。例如,VARCHAR2 数据类型。以下示例说明了声明和使用一些字符串变量 -
DECLARE name varchar2(20); company varchar2(30); introduction clob; choice char(1); BEGIN name := 'John Smith'; company := 'Infotech'; introduction := ' Hello! I''m John Smith from Infotech.'; choice := 'y'; IF choice = 'y' THEN dbms_output.put_line(name); dbms_output.put_line(company); dbms_output.put_line(introduction); END IF; END; /
当上面的代码在 SQL 提示符下执行时,会产生以下结果 -
John Smith Infotech Hello! I'm John Smith from Infotech. PL/SQL procedure successfully completed
要声明固定长度字符串,请使用 CHAR 数据类型。在这里,您不必指定固定长度变量的最大长度。如果您忽略长度约束,Oracle 数据库会自动使用所需的最大长度。以下两个声明是相同的 -
red_flag CHAR(1) := 'Y'; red_flag CHAR := 'Y';
PL/SQL 字符串函数和运算符
PL/SQL 提供连接运算符(||)用于连接两个字符串。下表提供了 PL/SQL 提供的字符串函数 -
序列号 | 功能与目的 |
---|---|
1 | ASCII(x); 返回字符 x 的 ASCII 值。 |
2 | CHR(x); 返回 ASCII 值为 x 的字符。 |
3 | 连接(x,y); 连接字符串 x 和 y 并返回附加的字符串。 |
4 | INITCAP(x); 将 x 中每个单词的首字母转换为大写并返回该字符串。 |
5 | INSTR(x, find_string [, 开始] [, 出现]); 在 x 中搜索find_string并返回它出现的位置。 |
6 | INSTRB(x); 返回一个字符串在另一个字符串中的位置,但返回以字节为单位的值。 |
7 | 长度(x); 返回 x 中的字符数。 |
8 | 长度HB(x); 返回单字节字符集的字符串长度(以字节为单位)。 |
9 | 下(x); 将 x 中的字母转换为小写并返回该字符串。 |
10 | LPAD(x, 宽度 [, pad_string]) ; 在x左侧填充空格,以使字符串的总长度达到 width 个字符。 |
11 | LTRIM(x [, 修剪字符串]); 从x左侧修剪字符。 |
12 | NANVL(x, 值); 如果 x 与 NaN 特殊值(不是数字)匹配,则返回 value,否则返回x 。 |
13 | NLS_INITCAP(x); 与 INITCAP 函数相同,只是它可以使用 NLSSORT 指定的不同排序方法。 |
14 | NLS_LOWER(x) ; 与 LOWER 函数相同,只是它可以使用 NLSSORT 指定的不同排序方法。 |
15 | NLS_UPPER(x); 与 UPPER 函数相同,只是它可以使用 NLSSORT 指定的不同排序方法。 |
16 | NLSSORT(x); 更改字符排序方法。必须在任何 NLS 函数之前指定;否则,将使用默认排序。 |
17 号 | NVL(x, 值); 如果x为 null ,则返回值;否则,返回 x。 |
18 | NVL2(x, 值1, 值2); 如果 x 不为 null,则返回 value1;如果 x 为 null,则返回 value2。 |
19 | REPLACE(x, 搜索字符串, 替换字符串); 在x中搜索search_string 并将其替换为replace_string。 |
20 | RPAD(x, 宽度 [, pad_string]); 将x垫到右侧。 |
21 | RTRIM(x [, 修剪字符串]); 从右侧修剪x 。 |