Oracle PL/SQL 存储过程和函数及示例
过程和函数是可以创建并作为数据库对象保存在数据库中的子程序。它们也可以在其他块中调用或引用。
除此之外,我们将介绍这两个子程序之间的主要区别。此外,我们将讨论 Oracle 内置函数。
PL/SQL 子程序中的术语
在了解 PL/SQL 子程序之前,我们将讨论这些子程序的各种术语。以下是我们将要讨论的术语。
产品型号
参数是变量或任何有效的占位符 PL/SQL 数据类型 PL/SQL 子程序通过它与主代码交换值。此参数允许向子程序提供输入并从这些子程序中提取。
- 这些参数应该在创建时与子程序一起定义。
- 这些参数包含在这些子程序的调用语句中,以便与子程序进行值交互。
- 子程序中参数的数据类型和调用语句中的参数的数据类型应该相同。
- 在参数声明时不应提及数据类型的大小,因为此类型的大小是动态的。
根据其用途,参数分为
- IN 参数
- OUT 参数
- IN OUT 参数
IN 参数
- 该参数用于给子程序提供输入。
- 在子程序中是只读变量,其值在子程序内部不可改变。
- 在调用语句中,这些参数可以是变量、文字值或表达式,例如,它可以是像“5*8”或“a/b”这样的算术表达式,其中“a”和“b”是变量。
- 默认情况下,参数为IN类型。
OUT 参数
- 此参数用于获取子程序的输出。
- 在子程序中是一个可读写的变量,其值可以在子程序内部改变。
- 在调用语句中,这些参数应该始终是一个变量,以保存来自当前子程序的值。
IN OUT 参数
- 此参数用于提供输入以及从子程序获取输出。
- 在子程序中是一个可读写的变量,其值可以在子程序内部改变。
- 在调用语句中,这些参数应该始终是一个变量,以保存来自子程序的值。
这些参数类型应该在创建子程序时提及。
返回
RETURN 是指示编译器将控制权从子程序切换到调用语句的关键字。在子程序中,RETURN 只是意味着控制权需要从子程序中退出。一旦控制器在子程序中找到 RETURN 关键字,就会跳过此关键字之后的代码。
通常,父块或主块将调用子程序,然后控制权将从这些父块转移到被调用的子程序。子程序中的 RETURN 将控制权返回到其父块。对于函数,RETURN 语句也会返回值。在函数声明时始终会提到此值的数据类型。数据类型可以是任何有效的 PL/SQL 数据类型。
PL/SQL 中的过程是什么?
A 程序 PL/SQL 中的子程序单元是由一组可以通过名称调用的 PL/SQL 语句组成的子程序单元。PL/SQL 中的每个过程都有自己独特的名称,可以通过该名称引用和调用。 Oracle 数据库存储为数据库对象。
请注意: 子程序只是一个过程,需要根据需要手动创建。创建后,它们将作为数据库对象存储。
PL/SQL中Procedure子程序单元的特点如下:
- 程序是程序的独立块,可以存储在 数据库.
- 可以通过引用其名称来调用这些 PLSQL 过程,以执行 PL/SQL 语句。
- 它主要用于执行PL/SQL中的一个过程。
- 它可以有嵌套的块,也可以在其他块或包内定义和嵌套。
- 它包含声明部分(可选)、执行部分、异常处理部分(可选)。
- 这些值可以传递到 Oracle 过程或通过参数从过程获取。
- 这些参数应该包含在调用语句中。
- SQL 中的过程可以使用 RETURN 语句将控制权返回给调用块,但不能通过 RETURN 语句返回任何值。
- 不能直接从 SELECT 语句调用过程。它们可以从另一个块或通过 EXEC 关键字调用。
句法
CREATE OR REPLACE PROCEDURE <procedure_name> ( <parameterl IN/OUT <datatype> .. . ) [ IS | AS ] <declaration_part> BEGIN <execution part> EXCEPTION <exception handling part> END;
- CREATE PROCEDURE 指示编译器在 Oracle关键字“OR REPLACE”指示编译器用当前过程替换现有过程(如果有)。
- 过程名称应该是唯一的。
- 当存储过程位于 Oracle 嵌套到其他一些块中。如果过程是独立的,则将使用“AS”。除了此编码标准外,两者具有相同的含义。
示例 1:创建过程并使用 EXEC 调用它
在此示例中,我们将创建一个 Oracle 程序以名称作为输入,并打印欢迎消息作为输出。我们将使用 EXEC 命令来调用该程序。
CREATE OR REPLACE PROCEDURE welcome_msg (p_name IN VARCHAR2) IS BEGIN dbms_output.put_line (‘Welcome '|| p_name); END; / EXEC welcome_msg (‘Guru99’);
代码说明:
- 代码行 1:创建名称为“welcome_msg”且带有一个“IN”类型的参数“p_name”的过程。
- 代码行 4:通过连接输入的名称来打印欢迎信息。
- 过程编译成功。
- 代码行 7:使用带有参数“Guru99”的EXEC 命令调用该过程。过程被执行,并且消息被打印为“Welcome Guru99”。
什么是函数?
函数是一个独立的 PL/SQL 子程序。与 PL/SQL 过程一样,函数有一个唯一的名称,可以通过该名称引用。这些函数存储为 PL/SQL 数据库对象。以下是函数的一些特征。
- 函数是一个独立的块,主要用于计算目的。
- 函数使用 RETURN 关键字来返回值,并且其数据类型在创建时定义。
- 函数应该返回一个值或引发异常,即函数中返回是强制性的。
- 没有 DML 语句的函数可以在 SELECT 查询中直接调用,而带有 DML 操作的函数只能从其他 PL/SQL 块中调用。
- 它可以有嵌套的块,也可以在其他块或包内定义和嵌套。
- 它包含声明部分(可选)、执行部分、异常处理部分(可选)。
- 可以将值传递到函数中或者通过参数从过程中获取。
- 这些参数应该包含在调用语句中。
- PLSQL 函数除了使用 RETURN 之外,还可以通过 OUT 参数返回值。
- 由于它总是返回值,在调用语句中它总是伴随赋值运算符来填充变量。
句法
CREATE OR REPLACE FUNCTION <procedure_name> ( <parameterl IN/OUT <datatype> ) RETURN <datatype> [ IS | AS ] <declaration_part> BEGIN <execution part> EXCEPTION <exception handling part> END;
- CREATE FUNCTION 指示编译器创建一个新函数。关键字“OR REPLACE”指示编译器用当前函数替换现有函数(如果有)。
- 函数名称应该是唯一的。
- 应该提到 RETURN 数据类型。
- 当过程嵌套在其他块中时,将使用关键字“IS”。如果过程是独立的,则将使用“AS”。除了此编码标准外,两者具有相同的含义。
示例 1:创建函数并使用匿名块调用它
在这个程序中,我们将创建一个函数,该函数以名称作为输入并返回欢迎消息作为输出。我们将使用匿名块和 select 语句来调用该函数。
CREATE OR REPLACE FUNCTION welcome_msgJune ( p_name IN VARCHAR2) RETURN VAR.CHAR2 IS BEGIN RETURN (‘Welcome ‘|| p_name); END; / DECLARE lv_msg VARCHAR2(250); BEGIN lv_msg := welcome_msg_func (‘Guru99’); dbms_output.put_line(lv_msg); END; SELECT welcome_msg_func(‘Guru99:) FROM DUAL;
代码说明:
- 代码行 1:创建 Oracle 函数名称为“welcome_msg_func”,其参数“p_name”为“IN”类型。
- 代码行 2:声明返回类型为 VARCHAR2
- 代码行 5:返回连接值“Welcome”和参数值。
- 代码行 8:匿名块调用上述函数。
- 代码行 9:声明变量的数据类型与函数的返回数据类型相同。
- 代码行 11:调用函数并将返回值填充到变量“lv_msg”。
- 代码行 12:打印变量值。您将在此处获得的输出是“Welcome Guru99”
- 代码行 14:通过SELECT语句调用相同函数。返回值直接指向标准输出。
过程和函数之间的相似之处
- 两者都可以从其他 PL/SQL 块调用。
- 如果子程序中引发的异常未在子程序中处理 异常处理 部分,那么它将传播到调用块。
- 两者都可以根据需要具有任意数量的参数。
- 两者在 PL/SQL 中都被视为数据库对象。
程序与功能:主要区别
程序 | 功能 |
---|---|
主要用于执行某个进程 | 主要用于进行一些计算 |
无法在 SELECT 语句中调用 | 可以在 SELECT 语句中调用不包含 DML 语句的函数 |
使用 OUT 参数返回值 | 使用 RETURN 返回值 |
不强制返回值 | 必须返回值 |
RETURN 将简单地退出子程序控制。 | RETURN 将退出子程序控制并返回值 |
创建时不会指定返回数据类型 | 返回数据类型在创建时是强制性的 |
PL/SQL 中的内置函数
PL / SQL 包含各种用于处理字符串和日期数据类型的内置函数。在这里我们将了解常用函数及其用法。
转换函数
这些内置函数用于将一种数据类型转换为另一种数据类型。
功能名称 | 用法 | 例如: |
---|---|---|
字符 | 将其他数据类型转换为字符数据类型 | 到字符(123); |
TO_DATE(字符串,格式) | 将给定的字符串转换为日期。字符串应与格式匹配。 |
TO_DATE('2015-JAN-15', 'YYYY-MON-DD'); 输出:1 / 15 / 2015 |
TO_NUMBER(文本,格式) |
将文本转换为给定格式的数字类型。 信息‘9’表示数字的数量 |
从双重中选择TO_NUMBER('1234′,'9999');
输出:1234 从双重中选择TO_NUMBER('1,234.45′,'9,999.99'); 输出:1234 |
字符串函数
这些是用于字符数据类型的函数。
功能名称 | 用法 | 例如: |
---|---|---|
INSTR(文本,字符串,开始,发生) | 给出给定字符串中特定文本的位置。
|
从双精度中选择 INSTR(‘AEROPLANE’,‘E’,2,1)
输出:2 从双精度中选择 INSTR(‘AEROPLANE’,‘E’,2,2) 输出:9(2nd E 的出现 |
SUBSTR(文本,开始,长度) | 给出主字符串的子字符串值。
|
从双精度中选择 substr('飞机',1,7)
输出: 航空飞机 |
上部(文本) | 返回所提供文本的大写字母 | 从对偶中选择上部(‘guru99’);
输出:GURU99 |
下方 ( 文字 ) | 返回所提供文本的小写形式 | 从双重中选择较低('AerOpLane');
输出:飞机 |
INITCAP(文本) | 返回以大写字母开头的给定文本。 | 从双中选择(‘guru99’)
输出:Guru99 从双重中选择(“我的故事”) 输出: 我的故事 |
长度(文本) | 返回给定字符串的长度 | 从对偶中选择 LENGTH (‘guru99’);
输出:6 |
LPAD(文本,长度,pad_char) | 使用给定的字符在左侧填充给定长度(总字符串)的字符串 | 从 dual 中选择 LPAD('guru99', 10, '$');
输出:$$$$guru99 |
RPAD(文本,长度,pad_char) | 使用给定的字符在右侧填充给定长度(总字符串)的字符串 | 从双中选择 RPAD('guru99′,10,'-')
输出:guru99—— |
LTRIM(文本) | 修剪文本中的前导空白 | 从双重中选择 LTRIM(' Guru99');
输出:Guru99 |
RTRIM(文本) | 修剪文本尾部的空白 | 从双重中选择 RTRIM(‘Guru99’);
输出; Guru99 |
日期函数
这些是用于处理日期的函数。
功能名称 | 用法 | 例如: |
---|---|---|
ADD_MONTHS(日期,月份数) | 将给定的月份添加到日期 | 添加月份('2015-01-01',5);
输出:05 / 01 / 2015 |
系统日期 | 返回服务器的当前日期和时间 | 从双重中选择SYSDATE;
输出:10 年 4 月 2015 日下午 2:11:43 |
TRUNC | 将日期变量四舍五入为较低的可能值 | 从 dual 中选择 sysdate、TRUNC(sysdate);
输出:10 年 4 月 2015 日下午 2:12:39 |
圆型行李箱 | 将日期四舍五入到最接近的上限或下限 | 从双精度中选择系统日期、ROUND(系统日期)
输出:10 年 4 月 2015 日下午 2:14:34 |
MONTHS_BETWEEN | 返回两个日期之间的月份数 | 从双表中选择 MONTHS_BETWEEN (sysdate+60, sysdate)
输出:2 |
总结
在本章中,我们学习了以下内容。
- 如何创建过程以及调用它的不同方法
- 如何创建函数以及调用它的不同方法
- 过程和函数之间的相同点和不同点
- PL/SQL 子程序中的参数和 RETURN 常用术语
- 常见的内置函数 Oracle PL / SQL