返回介绍

PL/SQL 过程 - PL/SQL 教程

发布于 2025-02-22 13:46:46 字数 4770 浏览 0 评论 0 收藏 0

子程序是一个程序单元/模块执行特定的任务。这些子程序被组合以形成更大的程序。这基本上是被称为“模块化设计”。子程序可以调用由另一个子程序或程序被称为调用程序。

子程序可以创建:

  • 在模式层面
  • 在包里面
  • 在一个 PL/SQL 块内

模式级子程序是一个独立的子程序。它使用 CREATE PROCEDURE 或 CREATE FUNCTION 语句创建。它被存储在数据库中,并且可以使用 DROP PROCEDURE 或 DROP FUNCTION 语句被删除。

一个包内创建的一个子程序是一个封装子程序。它被存储在数据库中,仅当包被删除使用 DROP PACKAGE 语句可以被删除。我们将讨论在"PL/SQL - 包“ 章节中。

PL/SQL 子程序被命名,可使用一组参数来调用 PL/SQL 块。 PL/SQL 提供两种子程序:

  • 函数:这些子程序返回一个值,主要用于计算并返回一个值。
  • 过程:这些子程序没有直接返回值,主要用于执行操作。

本章将重点介绍 PL/SQL 的过程的重内容,我们将在下一章介绍学习"PL/SQL 函数“。

PL/SQL 子程序部分

每个 PL/SQL 子程序有一个名称,并且可以具有一个参数列表。就像匿名 PL/SQL 块,并命名块子程序也将有以下三个部分:

S.N.部分 & 描述
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;

这里,

  • 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;

所以,可以使用下面的语句删除 greetings

BEGIN
   DROP PROCEDURE greetings;
END;
/

PL/SQL 子程序参数模式

S.N.参数模式 & 描述
1IN 一个 IN 参数传递一个值到子程序。它是一个只读的参数。内部的子程序,一个 IN 参数的作用就像一个常数。它不能再被分配值。 可以通过一个常量,文字,初始化变量或表达式作为一个 IN 参数。也可以把它初始化为默认值;然而,在这种情况下,它从子程序调用删去。这就是参数传递的默认模式。参数是通过引用传递。
2OUT OUT 参数返回一个值到调用程序。在内部的子程序 OUT 参数就像一个变量。可以改变它的值并引用分配后的值。实际参数必须是变量,它是按值传递。
2IN 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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文