Plsql 简明教程
PL/SQL - Procedures
在本章中,我们将讨论 PL/SQL 中的过程。 subprogram 是执行特定任务的程序单元/模块。这些子程序组合在一起形成更大的程序。这基本上被称为“模块化设计”。可以通过称为 calling program 的另一个子程序或程序来调用子程序。
可以创建子程序 −
-
At the schema level
-
Inside a package
-
Inside a PL/SQL block
在模式级别,子程序是 standalone subprogram 。它使用 CREATE PROCEDURE 或 CREATE FUNCTION 语句创建。它存储在数据库中,可以使用 DROP PROCEDURE 或 DROP FUNCTION 语句进行删除。
在包内创建的子程序是 packaged subprogram 。它存储在数据库中,并且仅当包使用 DROP PACKAGE 语句删除时才能删除。我们将在 'PL/SQL - Packages' 章中讨论包。
PL/SQL 子程序是带有一组参数的命名的 PL/SQL 块,可以使用这些参数对其进行调用。PL/SQL 提供两种子程序 −
-
Functions − 这些子程序返回单个值;主要用于计算并返回一个值。
-
Procedures − 这些子程序不直接返回值;主要用于执行一项操作。
本章将介绍 PL/SQL procedure 的重要方面。我们将在下一章讨论 PL/SQL function 。
Parts of a PL/SQL Subprogram
每个 PL/SQL 子程序都有一个名称,还可以有一个参数列表。与匿名 PL/SQL 块一样,命名的块还将具有以下三部分 −
S.No |
Parts & Description |
1 |
Declarative Part 是可选部分。但是,子程序的声明部分不以 DECLARE 关键字开头。其中包含类型、游标、常量、变量、异常和嵌套子程序的声明。这些项对于子程序来说是本地的,并且在子程序完成执行时停止存在。 |
2 |
Executable Part 是强制部分,并且包含执行指定操作的语句。 |
3 |
Exception-handling 又是一个可选部分。其中包含处理运行时错误的代码。 |
Creating a Procedure
使用 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;
其中,
-
procedure-name 指定过程的名称。
-
[OR REPLACE] 选项允许修改现有过程。
-
可选参数列表包含名称、模式和参数的类型。 IN 表示将从外部传递的值,OUT 表示用于在过程外部返回值的参数。
-
procedure-body 包含可执行部分。
-
使用 AS 关键字而不是 IS 关键字来创建独立过程。
Executing a Standalone Procedure
独立过程可以通过两种方式来调用 −
-
Using the EXECUTE keyword
-
从 PL/SQL 块调用过程的名称
通过 EXECUTE 关键字可以调用名为 'greetings' 的上述过程,如下所示 −
EXECUTE greetings;
上述调用将显示 −
Hello World
PL/SQL procedure successfully completed.
这个过程也可从另一个 PL/SQL 块调用 -
BEGIN
greetings;
END;
/
上述调用将显示 −
Hello World
PL/SQL procedure successfully completed.
Deleting a Standalone Procedure
使用 DROP PROCEDURE 语句删除独立过程。语法用于删除过程是 -
DROP PROCEDURE procedure-name;
你可以使用以下语句来删除 greetings 过程 -
DROP PROCEDURE greetings;
Parameter Modes in PL/SQL Subprograms
在 PL/SQL 子程序中输出参数模式列表 -
S.No |
Parameter Mode & Description |
1 |
IN IN 参数让你可以将值传递给子程序。 It is a read-only parameter 。在子程序中,IN 参数用作常量。不能为其分配值。你可以将常量、文本、已初始化变量或表达式作为 IN 参数传递。你也可以为其初始化一个默认值,但如果其在子程序调用里,它将省略。 It is the default mode of parameter passing. Parameters are passed by reference 。 |
2 |
OUT OUT 参数向调用程序返回一个值。在子程序中,OUT 参数用作变量。你能改变它的值并在分配后参考该值。 The actual parameter must be variable and it is passed by value 。 |
3 |
IN OUT IN OUT 参数向子程序传递一个初始值并向调用者返回一个更新的值。可以为其分配一个值并可以读取该值。对应于 IN OUT 形式参数的实际参数必须是变量,而不是常量或表达式。必须为形式参数分配值。 Actual parameter is passed by value. 。 |
IN & OUT Mode Example 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 Mode Example 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.
Methods for Passing Parameters
实际参数可以通过三种方式传递 -
-
Positional notation
-
Named notation
-
Mixed notation
Positional Notation
在位置符号中,你可以调用过程为 -
findMin(a, b, c, d);
在位置符号中,第一个实际参数替换了第一个形式参数;第二个实际参数替换了第二个形式参数,以此类推。因此, a 替换为 x, b 替换为 y, c 替换为 z 替换 d 替换为 m 。