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 的试用版 -

下载 Oracle 11g 快捷版

您必须根据您的操作系统下载 32 位或 64 位版本的安装。通常有两个文件。我们已经下载了64位版本。您还将在您的操作系统上使用类似的步骤,无论是 Linux 还是 Solaris。

  • win64_11gR2_database_1of2.zip

  • win64_11gR2_database_2of2.zip

下载上述两个文件后,您需要将它们解压缩到一个目录数据库中,在该目录下您将找到以下子目录 -

Oracle 子目录

步骤1

现在让我们使用安装文件启动 Oracle 数据库安装程序。以下是第一个屏幕。您可以提供您的电子邮件 ID 并选中复选框,如以下屏幕截图所示。单击下一步按钮。

甲骨文安装1

第2步

您将被引导至以下屏幕;取消选中该复选框并单击继续按钮继续。

Oracle安装错误

步骤3

只需使用单选按钮选择第一个选项“创建和配置数据库” ,然后单击“下一步”按钮即可继续。

甲骨文安装2

步骤4

我们假设您安装 Oracle 的基本目的是为了学习,并且将其安装在您的 PC 或笔记本电脑上。因此,选择“桌面类”选项并单击“下一步”按钮继续。

甲骨文安装3

步骤5

提供一个位置,您将在其中安装 Oracle 服务器。只需修改Oracle Base,其他位置就会自动设置。您还必须提供密码;这将由系统 DBA 使用。提供所需信息后,单击“下一步”按钮继续。

甲骨文安装4

步骤6

再次单击“下一步”按钮继续。

甲骨文安装5

步骤7

单击“完成”按钮继续;这将开始实际的服务器安装。

甲骨文安装6

步骤8

这将需要一些时间,直到 Oracle 开始执行所需的配置。

Oracle 安装 7

步骤9

在这里,Oracle安装将复制所需的配置文件。这应该需要一些时间 -

Oracle配置

步骤10

复制数据库文件后,您将看到以下对话框。只要点击确定按钮就可以出来了。

Oracle配置

第11步

安装后,您将看到以下最终窗口。

甲骨文安装8

最后一步

现在是时候验证您的安装了。如果您使用的是 Windows,请在命令提示符下使用以下命令 -

sqlplus "/ as sysdba"

您应该有 SQL 提示符,您可以在其中编写 PL/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

可执行命令

该部分包含在关键字BEGINEND之间,是强制部分。它由程序的可执行PL/SQL 语句组成。它应该至少有一行可执行代码,这可能只是一个NULL 命令,表示不应该执行任何操作。

3

异常处理

本节以关键字EXCEPTION开始。此可选部分包含处理程序中错误的异常。

每个 PL/SQL 语句都以分号 (;) 结尾。PL/SQL 块可以使用BEGINEND嵌套在其他 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 变量、常量和参数必须具有有效的数据类型,该数据类型指定存储格式、约束和有效值范围。本章我们将重点关注SCALARLOB数据类型。其他两种数据类型将在其他章节中介绍。

序列号 类别及描述
1

标量

没有内部组件的单个值,例如NUMBER、DATEBOOLEAN

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数据类型存储逻辑运算中使用的逻辑值逻辑值是布尔值TRUEFALSE以及值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 预定义了子类型CHARACTERINTEGER,如下所示 -

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、FALSENULL

显示示例

操作员 描述 例子
喜欢 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 中的决策语句

PL/SQL 编程语言提供以下类型的决策语句。单击以下链接查看其详细信息。

序列号 声明及说明
1 IF - THEN 语句

IF语句将条件与由关键字THENEND 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-THENIF-THEN-ELSIF语句中使用一个IF-THENIF-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 。