orientdb数据库-PL/SQL存储过程

跨零代码为大家提供高品质的解决方案,请大家多多来访,跨零不胜感激,在此谢过。

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

可以在以下几个地方中创建一个子程序 –

  • 在模式(schema)级别中
  • 一个程序包中
  • 在PL/SQL块中

在模式(schema)级别中,子程序是一个独立的子程序。它是使用CREATE PROCEDURECREATE FUNCTION语句创建的。它存储在数据库中,可以使用DROP PROCEDUREDROP 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!”在屏幕上。

SET SERVEROUTPUT ON SIZE 99999; CREATE OR REPLACE PROCEDURE greetings  AS  BEGIN     dbms_output.put_line('Hello World!');  END;  /  -- 执行存储过程 exec greetings; -- 或者 EXECUTE greetings; 

当使用SQL提示符执行上述代码时,它将产生以下结果 –

PL/SQL存储过程

执行独立程序

独立的存储程序可以通过两种方式调用 –

  • 使用EXECUTE关键字
  • 从PL/SQL块调用过程的名称

可以使用EXECUTE关键字调用名为“greetings”的存储过程如下 –

EXECUTE greetings; 

上述调用将显示结果为 –

SQL> EXECUTE greetings; Hello World!  PL/SQL 过程已成功完成。  SQL> 

该过程也可以从另一个PL/SQL块调用,例如 –

BEGIN     greetings;  END;  / 

执行上面示例代码,得到以下结果 –

SQL> BEGIN   2     greetings;   3  END;   4  / Hello World!  PL/SQL 过程已成功完成。  SQL> 

删除独立存储过程

使用DROP PROCEDURE语句删除独立存储过程。删除程序的语法是 –

DROP PROCEDURE procedure-name; 

可以使用以下语句删除greetings存储过程程序 –

DROP PROCEDURE greetings; 

PL/SQL子程序中的参数模式

下表列出了PL/SQL子程序中的参数模式 –

编号 参数模式 描述
1 IN IN参数允许将值传递给子程序。它是一个只读参数。在子程序中,IN参数的作用如常数,它不能被赋值。可以将常量,文字,初始化的变量或表达式作为IN参数传递。也可以将其初始化为默认值; 然而,在这种情况下,从子程序调用中省略它。 它是参数传递的默认模式。参数通过引用传递。
2 OUT OUT参数返回一个值给调用程序。在子程序中,OUT参数像变量一样。 可以更改其值并在分配该值后引用该值。实际参数必须是可变的,并且通过值传递。
3 IN OUT IN OUT参数将初始值传递给子程序,并将更新的值返回给调用者。 它可以分配一个值,该值可以被读取。对应于IN OUT形式参数的实际参数必须是变量,而不是常量或表达式。正式参数必须分配一个值。实际参数(实参)通过值传递。

IN和OUT模式 – 示例1

假设以下存储过程需要求出两个值中的最小值。这里,存储过程两个输入的数字使用IN模式,并使用OUT模式参数返回最小值。

SET SERVEROUTPUT ON SIZE 99999; 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:= 12;     b:= 35;     findMin(a, b, c);     dbms_output.put_line('两个数:12, 35中的最小值是 : ' || c);  END;  / 

当上述代码在SQL提示符下执行时,它会产生以下结果 –

两个数:12, 35中的最小值是 : 12 

IN和OUT模式 – 示例2

此过程计算传递值的值的平方。此示例显示了如何使用相同的参数来接受值,然后返回另一个结果。

SET SERVEROUTPUT ON SIZE 99999; DECLARE     a number;  PROCEDURE squareNum(x IN OUT number) IS  BEGIN    x := x * x;  END;   BEGIN     a:= 11;     squareNum(a);     dbms_output.put_line(' Square of (23): ' || a);  END;  / 

当上述代码在SQL提示符下执行时,它会产生以下结果 –

PL/SQL存储过程

传递参数的方法

实际参数(实参)可以通过三种方式传递 –

  • 位置符号
  • 命名符号
  • 混合符号

位置符号

在位置符号中,可以调用存储过程如下 –

findMin(a, b, c, d); 

在位置符号中,第一个实际参数代替第一个形式参数; 第二个实际参数代替第二个形式参数,依此类推。 因此,a代替xb代替yc代替zd代替m

命名符号

在命名符号中,实际参数与使用箭头符号(=>)的形式参数相关联。调用存储过程如下所示 –

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

混合符号

在混合符号表示中,可以在过程调用中混合使用符号; 然而,位置符号应在命名符号之前。

以下调用存储过程的方式是合法的 –

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

但是,以下这种是不合法的:

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

  

从零到一,创造未来!跨零综合IT问题解决服务站,欢迎你的到来。Oracle数据库教程 plsql数据库/a> 只为你绽放。

本文固定链接: http://kua0.com/2019/05/18/orientdb数据库-pl-sql存储过程/

为您推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注