PL/SQL - 过程

  • 简述

    在本章中,我们将讨论 PL/SQL 中的过程。一种子程序是执行特定任务的程序单元/模块。这些子程序组合成更大的程序。这基本上被称为“模块化设计”。一个子程序可以被另一个子程序或程序调用calling program.
    可以创建子程序 -
    • 在架构级别
    • 包内
    • 在 PL/SQL 块中
    在模式级别,子程序是一个 standalone 子程序. 它是使用 CREATE PROCEDURE 或 CREATE FUNCTION 语句创建的。它存储在数据库中,可以使用 DROP PROCEDURE 或 DROP FUNCTION 语句删除。
    在包内创建的子程序是 packaged 子程序. 它存储在数据库中,只有在使用 DROP PACKAGE 语句删除包时才能删除。我们将在本章讨论包'PL/SQL - Packages'.
    PL/SQL 子程序被命名为 PL/SQL 块,可以用一组参数调用它们。PL/SQL 提供两种子程序 -
    • Functions− 这些子程序返回单个值;主要用于计算和返回一个值。
    • Procedures− 这些子程序不直接返回值;主要用于执行一个动作。
    本章将涵盖一个重要方面 PL/SQL procedure. 我们会讨论PL/SQL function 在下一章。
  • 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 块调用过程的名称
    上面的程序命名为 '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 子程序中的参数模式 -
    序号 参数模式及说明
    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 模式示例 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 被替换为 zd 被替换为 m.

    命名符号

    在命名符号中,实参与形参使用 arrow symbol ( => ). 过程调用将如下所示 -
    
    findMin(x => a, y => b, z => c, m => d);
    

    混合符号

    在混合表示法中,您可以在过程调用中混合使用两种表示法;但是,位置符号应该在命名符号之前。
    以下调用是合法的 -
    
    findMin(a, b, c, m => d);
    
    但是,这是不合法的:
    
    findMin(x => a, b, c, d);