Plsql 简明教程

PL/SQL - Procedures

在本章中,我们将讨论 PL/SQL 中的过程。 subprogram 是执行特定任务的程序单元/模块。这些子程序组合在一起形成更大的程序。这基本上被称为“模块化设计”。可以通过称为 calling program 的另一个子程序或程序来调用子程序。

可以创建子程序 −

  1. At the schema level

  2. Inside a package

  3. 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 提供两种子程序 −

  1. Functions − 这些子程序返回单个值;主要用于计算并返回一个值。

  2. 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;

其中,

  1. procedure-name 指定过程的名称。

  2. [OR REPLACE] 选项允许修改现有过程。

  3. 可选参数列表包含名称、模式和参数的类型。 IN 表示将从外部传递的值,OUT 表示用于在过程外部返回值的参数。

  4. procedure-body 包含可执行部分。

  5. 使用 AS 关键字而不是 IS 关键字来创建独立过程。

Example

以下示例创建了一个简单过程,在执行时,会在屏幕上显示字符串“Hello World!”。

CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
   dbms_output.put_line('Hello World!');
END;
/

当使用 SQL 提示执行以上代码时,它将会生成以下结果 −

Procedure created.

Executing a Standalone Procedure

独立过程可以通过两种方式来调用 −

  1. Using the EXECUTE keyword

  2. 从 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

实际参数可以通过三种方式传递 -

  1. Positional notation

  2. Named notation

  3. Mixed notation

Positional Notation

在位置符号中,你可以调用过程为 -

findMin(a, b, c, d);

在位置符号中,第一个实际参数替换了第一个形式参数;第二个实际参数替换了第二个形式参数,以此类推。因此, a 替换为 x, b 替换为 y, c 替换为 z 替换 d 替换为 m

Named Notation

在已命名符号中,实际参数与形式参数使用 arrow symbol ( ⇒ ) 关联。过程调用将像以下示例 -

findMin(x => a, y => b, z => c, m => d);

Mixed Notation

在混合符号中,你可以在过程调用中混合这两种符号;但位置符号应先于已命名符号。

以下调用是合法的 -

findMin(a, b, c, m => d);

然而,这是不合法的:

findMin(x => a, b, c, d);