❮ PL/SQL 数组
PL/SQL 函数 ❯
PL/SQL - 存储过程
更新于 2024/9/5 6:02:00
在本章中,我们将讨论 PL/SQL 中的存储过程。 subprogram 是执行特定任务的程序单元/模块。 这些子程序组合起来形成更大的程序。 这基本上被称为"模块化设计"。 一个子程序可以被另一个称为调用程序的子程序或程序调用。
可以创建子程序 −
在架构级别
包内
在 PL/SQL 块内
在架构级别,子程序是一个独立子程序。 它是使用 CREATE PROCEDURE 或 CREATE FUNCTION 语句创建的。 它存储在数据库中,可以使用 DROP PROCEDURE 或 DROP FUNCTION 语句删除。
在包中创建的子程序是打包的子程序。 它存储在数据库中,只有在使用 DROP PACKAGE 语句删除包时才能删除。 我们将在'PL/SQL - Packages'一章中讨论包。
PL/SQL 子程序被命名为可以使用一组参数调用的 PL/SQL 块。 PL/SQL 提供了两种子程序 −
函数 − 这些子程序返回一个值; 主要用于计算和返回一个值。
存储过程 − 这些子程序不直接返回值; 主要用于执行一个动作。
本章将介绍 PL/SQL 存储过程 的重要方面。 我们将在下一章讨论PL/SQL 函数。
PL/SQL 子程序的组成部分
每个 PL/SQL 子程序都有一个名称,也可能有一个参数列表。 与匿名 PL/SQL 块一样,命名块也会有以下三个部分 −
S.No
Parts & Description
1
声明部分
它是一个可选部分。 但是,子程序的声明部分不以 DECLARE 关键字开头。 它包含类型、游标、常量、变量、异常和嵌套子程序的声明。 这些项目是子程序的本地项,并且在子程序完成执行时不再存在。
2
可执行部分
这是强制性部分,包含执行指定操作的语句。
3
异常处理
这又是一个可选部分。 它包含处理运行时错误的代码。
创建过程
一个过程是用 CREATE OR REPLACE PROCEDURE 语句创建的。 CREATE OR REPLACE PROCEDURE 语句的简化语法如下 −
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
{IS | AS}
BEGIN
< procedure_body >
END procedure_name;
Where,
procedure-name 指定过程的名称。
[OR REPLACE] 选项允许修改现有程序。
可选参数列表包含参数的名称、方式和类型。 IN 表示将从外部传递的值,OUT 表示将用于在过程之外返回值的参数。
procedure-body 包含可执行部分。
使用 AS 关键字代替 IS 关键字来创建独立过程。
示例
下面的示例创建一个简单的过程,执行时在屏幕上显示字符串 'Hello World!'。
CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
dbms_output.put_line('Hello World!');
END;
/
当使用 SQL 提示符执行上述代码时,会产生如下结果 −
Procedure created.
执行独立过程
可以通过两种方式调用独立过程 −
使用 EXECUTE 关键字
从 PL/SQL 块调用过程的名称
上面名为 'greetings' 的过程可以使用 EXECUTE 关键字调用为 −
EXECUTE greetings;
上面的调用会显示 −
Hello World
PL/SQL procedure successfully completed.
该过程也可以从另一个 PL/SQL 块调用 −
BEGIN
greetings;
END;
/
上面的调用会显示 −
Hello World
PL/SQL procedure successfully completed.
删除独立过程
使用 DROP PROCEDURE 语句删除独立过程。 删除过程的语法是 −
DROP PROCEDURE procedure-name;
您可以使用以下语句删除问候程序 −
DROP PROCEDURE greetings;
PL/SQL 子程序中的参数模式
下表列出了 PL/SQL 子程序中的参数模式 −
S.No
Parameter Mode & Description
1
IN
IN 参数允许您将值传递给子程序。 只读参数。 在子程序内部,IN 参数的作用类似于常量。 它不能被赋值。 您可以将常量、文字、初始化变量或表达式作为 IN 参数传递。 您也可以将其初始化为默认值; 但是,在这种情况下,它会从子程序调用中省略。 这是默认的参数传递模式。 参数通过引用传递。
2
OUT
OUT 参数向调用程序返回一个值。 在子程序内部,OUT 参数的作用类似于变量。 您可以更改其值并在分配后引用该值。 实参必须是可变的,并且是传值的。
3
IN OUT
IN OUT 参数将初始值传递给子程序,并将更新的值返回给调用者。 它可以被分配一个值并且可以读取该值。
IN OUT 形参对应的实参必须是变量,不能是常量或表达式。 形式参数必须赋值。 实参按值传递。
IN & OUT 模式示例 1
该程序找到两个值中的最小值。 在这里,该过程使用 IN 模式获取两个数字,并使用 OUT 参数返回它们的最小值。
DECLARE
a number;
b number;
c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS
BEGIN
IF x < y THEN
z:= x;
ELSE
z:= y;
END IF;
END;
BEGIN
a:= 23;
b:= 45;
findMin(a, b, c);
dbms_output.put_line(' Minimum of (23, 45) : ' || c);
END;
/
在 SQL 提示符下执行上述代码时,会产生以下结果 −
Minimum of (23, 45) : 23
PL/SQL procedure successfully completed.
IN & OUT 模式示例 2
此过程计算传递值的平方。 这个例子展示了我们如何使用相同的参数来接受一个值,然后返回另一个结果。
DECLARE
a number;
PROCEDURE squareNum(x IN OUT number) IS
BEGIN
x := x * x;
END;
BEGIN
a:= 23;
squareNum(a);
dbms_output.put_line(' Square of (23): ' || a);
END;
/
在 SQL 提示符下执行上述代码时,会产生以下结果 −
Square of (23): 529
PL/SQL procedure successfully completed.
参数传递方法
实际参数可以通过三种方式传递 −
位置符号
命名符号
混合符号
位置符号
在位置符号中,您可以将过程称为 −
findMin(a, b, c, d);
在位置表示法中,第一个实参代替了第一个形参; 第二个实参代替第二个形参,以此类推。 因此,a 代替 x, b 代替 y, c 代替 z,d 代替 m。
命名符号
在命名符号中,实际参数使用 箭头符号 ( => ) 与形式参数相关联。 过程调用将如下所示 −
findMin(x => a, y => b, z => c, m => d);
混合符号
在混合表示法中,您可以在过程调用中混合使用两种表示法; 但是,位置符号应该在命名符号之前。
以下调用是合法的 −
findMin(a, b, c, m => d);
但是,这是不合法的:
findMin(x => a, b, c, d);
❮ PL/SQL 数组
PL/SQL 函数 ❯