codecamp

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块,并命名块子程序也将有以下三个部分:

SN 零件与说明
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;

哪里,

  • 程序-name指定过程的名称。

  • [OR REPLACE]选项允许修改现有的程序。

  • 可选的参数列表包含名称,模式和类型的参数。在表示该值将来自外部的传递和OUT表示该参数将被用于该过程的外面返回一个值。

  • 过程的主体部分包含可执行部分。

  • 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关键字作为被称为:

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子程序参数模式

SN 参数模式和说明
1

一个IN参数让你传递一个值到子程序。 它是只读的参数 。子程序内,一个IN参数就像一个常数。它不能被分配的值。你可以通过一个常量,文字,初始化变量或表达式作为一个IN参数。你也可以把它初始化为默认值;然而,在这种情况下,它是从子程序调用被删去。 这是参数传递的默认模式。参数是通过引用传递。

2 OUT

OUT参数返回一个值给调用程序。子程序内部,一个OUT参数就像一个变量。你可以改变它的价值和分配后参考价值。 实际参数必须是变量,它是按值传递

2 进出

一个IN OUT参数传递初始值,一个子程序,并返回一个更新的值给调用者。它可以被分配一个值,并且可以读出其值。

对应一个IN OUT形式参数的实际参数必须是一个变量,而不是一个常量或表达式。形式参数必须赋值。 实际参数是按值传递。

IN&OUT模式示例1

该程序发现的最小的两个值,这里过程需要使用模式中的两个号码,并使用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);

在位置记号,第一个实际参数取代了第一个正式的参数;第二个实际参数代替所述第二形式参数,依此类推。因此,一个被取代的为X,B代替Y,C为取代的对z和d被取代微米。

命名表示法

命名符号中,实际参数是用箭头符号的形式参数有关(=>)。因此,程序调用将如下所示:

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

混合书写

在混合符号,你可以混合在程序调用这两个符号;但是,位置标记应先于指定的符号。

下面的调用是合法的:

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

但是,这是不合法的:

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

PL / SQL环境设置
PL / SQL基本语法
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }