- PL/SQL 教程
- PL/SQL - 主页
- PL/SQL - 概述
- PL/SQL - 环境
- PL/SQL - 基本语法
- PL/SQL - 数据类型
- PL/SQL - 变量
- PL/SQL - 常量和文字
- PL/SQL - 运算符
- PL/SQL - 条件
- PL/SQL - 循环
- PL/SQL - 字符串
- PL/SQL - 数组
- PL/SQL - 过程
- PL/SQL - 函数
- PL/SQL - 游标
- PL/SQL - 记录
- PL/SQL - 异常
- PL/SQL - 触发器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事务
- PL/SQL - 日期和时间
- PL/SQL - DBMS 输出
- PL/SQL - 面向对象
- PL/SQL 有用资源
- PL/SQL - 问题与解答
- PL/SQL - 快速指南
- PL/SQL - 有用的资源
- PL/SQL - 讨论
PL/SQL - 过程
在本章中,我们将讨论 PL/SQL 中的过程。子程序是执行特定任务的程序单元/模块。这些子程序组合起来形成更大的程序。这基本上称为“模块化设计”。一个子程序可以被另一个子程序或称为调用程序的程序调用。
可以创建一个子程序 -
- 在架构级别
- 包装内
- 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 块一样,命名块也将具有以下三个部分 -
序列号 | 零件及描述 |
---|---|
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 块调用过程的名称
可以使用 EXECUTE 关键字调用上面名为“greetings”的过程:
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 子程序中的参数模式 -
序列号 | 参数模式及说明 |
---|---|
1 | 在 IN 参数允许您将值传递给子程序。它是一个只读参数。在子程序内部,IN 参数的作用类似于常量。无法为其赋值。您可以将常量、文字、初始化变量或表达式作为 IN 参数传递。您还可以将其初始化为默认值;然而,在这种情况下,子程序调用中会省略它。这是默认的参数传递模式。参数通过引用传递。 |
2 | 出去 OUT 参数向调用程序返回一个值。在子程序内部,OUT 参数的作用类似于变量。您可以更改其值并在分配后引用该值。实际参数必须是变量,并且通过值传递。 |
3 | 进出 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);