(七)PL/SQLPL/SQL过程

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

子程序可以创建:
    1.在模式层面
    2.在包里面
    3.在一个PL/SQL块内

  1.模式级子程序是一个独立的子程序。它使用CREATE PROCEDURE或CREATE FUNCTION语句创建。它被存储在数据库中,并且可以使用DROP PROCEDURE或DROP FUNCTION语句被删除。
  2.一个包内创建的一个子程序是一个封装子程序。它被存储在数据库中,仅当包被删除使用DROP PACKAGE语句可以被删除。
  3.PL/SQL子程序被命名,可使用一组参数来调用PL/SQL块。 PL/SQL提供两种子程序:
     函数:这些子程序返回一个值,主要用于计算并返回一个值。
     过程:这些子程序没有直接返回值,主要用于执行操作。
 
二、PL/SQL子程序部分
每个PL/SQL子程序有一个名称,并且可以具有一个参数列表。就像匿名PL/SQL块,并命名块子程序也将有以下三个部分:

S.N. 部分 & 描述
1 声明部分
它是一个任选的组成部分。然而声明部分用于子程序并在开始时使用DECLARE关键字。它包含:类型,光标,常量,变量,异常和嵌套子程序声明。这些项局部于子程序和停止时,子程序完成执行完成前存在。
2 执行部分
这是一个强制性的一部分,包含执行指定操作语句
3 异常处理部分
这也是一个可选部分,它包含处理运行时错误的代码。

三、一创建过程
过程语句创建,语法如下:
   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.

三、二执行独立程序
一个独立的程序可以有两种方式调用:
    1.使用EXECUTE关键字
    2.从PL/SQL块调用过程的名称
  
名为“greetings”的上述程序
1.程序可以调用EXECUTE关键字为:
  EXECUTE greetings;
上述调用会显示:
  Hello World
  PL/SQL procedure successfully completed.

2.程序也可以从另一个PL/SQL块调用:
  BEGIN
     greetings;
  END;
  /
上述调用会显示:
  Hello World
  PL/SQL procedure successfully completed.

三、三删除独立程序
删除一个程序的语法是:
   DROP PROCEDURE procedure-name;

下面的语句删除 greetings :  
  BEGIN
     DROP PROCEDURE greetings;
  END;
  /

四、PL/SQL子程序参数模式

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

五、方法传递参数
实际参数可以通过以下三种方式:
  位置标记
  命名符号
  混合符号

1.位置表示法
在位置符号,可以调用的程序为:
  findMin(a, b, c, d);
在位置表示法中,第一实际参数代入所述第一形式参数;第二实际参数代入所述第二形式参数,依此类推。那么,a取代x,b是取代为y,c为取代z以及d被代替m。

2.命名表示法
名为符号,实际参数与使用箭头符号的形式参数相关的(=>)。所以程序调用将如下所示:
  findMin(x=>a, y=>b, z=>c, m=>d);

3.混合表示法
在混合符号表示法中,可以混合这两种写法过程调用;【但是,位置标记应先于指定符号】。
  是合法的:findMin(a, b, c, m=>d);
  但是,这样是不合法的:findMin(x=>a, b, c, d);

时间: 2024-12-26 23:09:49

(七)PL/SQLPL/SQL过程的相关文章

Oracle数据库之PL/SQL过程与函数

Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据库中,以便共享. 过程和函数均存储在数据库中,并通过参数与其调用者交换信息.过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据. 1. 存储过程概念 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中.经过第一次编译后再次

hbase源码系列(七)Snapshot的过程

在看这一章之前,建议大家先去看一下snapshot的使用.可能有人会有疑问为什么要做Snapshot,hdfs不是自带了3个备份吗,这是个很大的误区,要知道hdfs的3个备份是用于防止网络传输中的失败或者别的异常情况导致数据块丢失或者不正确,它不能避免人为的删除数据导致的后果.它就想是给数据库做备份,尤其是做删除动作之前,不管是hbase还是hdfs,请经常做Snapshot,否则哪天手贱了... 直接进入主题吧,上代码. public void takeSnapshot(SnapshotDes

蓝的成长记——追逐DBA(12):七天七收获的SQL

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog: [简介] 个人在oracle路上的成长记录,其中以蓝自喻,分享成长中的情感.眼界与技术的变化与成长.敏感信息均以英文形式代替,不会泄露任何企业机密,纯为技术分享. 创作灵感源于对自己的自省和记录.若能对刚刚起步的库友起到些许的帮助或共鸣,欣慰不已. 欢迎拍砖,如有关技术细节表述有错误之处,请您留言或邮件([email protected])指明,不胜感激. [前言] 这是

PL/SQL编程基础

范例:编写不做任何工作的PL/SQL块 BEGIN NULL ; END ; /   范例:编写一个简单的PL/SQL程序 DECLARE v_num NUMBER ; -- 定义一个变量v_num BEGIN v_num := 30 ; -- 设置v_num的内容 DBMS_OUTPUT.put_line('V_NUM变量的内容是:' || v_num) ; END ; / 范例:编写PL/SQL块,输入一个雇员编号,而后取得指定的雇员姓名 DECLARE v_eno NUMBER ; v_e

【程序设计基础】第五、六、七章 伪代码 循环 过程/函数

伪代码(pseudo code) 符号体系: 1.开始和结束(begin end) 2.输入和输出(read write) 3.条件分支(if   ||  case of) if () then case *  of case 常量1:语句 case 常量2:语句 default:语句 end 4.循环(while  for  repeat ) while(条件表达式成立)do repeat  ********   until (条件表达式成立) for 循换变量初值 to 终值 step 步长

modSecurity规则学习(七)——防止SQL注入

1.数字型SQL注入 /opt/waf/owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "17"] [id "942100"] 被LibInjection Check 2.字符型SQL注入 同上 3.数据库后门 match1:LibInjection Check match2: 94235 SecRule REQUEST_COOKIES|!REQUES

SQL注入学习总结(七):其他类型SQL注入之SQL约束攻击

其他类型注入的详解(4) 4.sql约束攻击 知识点 数据库字符串比较:在数据库对字符串进行比较时,如果两个字符的长度不一样,则会将较短的字符串末尾填充空格,使两个字符串的长度一致. 比如这两条语句 select * from admin where username='vampire' select *from admin where username='vampire ' 他们的查询结果是一致的. INSERT截断: 这是数据库的另一个特性,当设计一字段时,我们都必须对其设定一个最大长度,比

书写sql过程中可能会遇到的问题

1.这种写法不安全,可能有sql注入的情况: 可以这么写: 原文地址:https://www.cnblogs.com/Yanglei-Faith/p/10411521.html

Mysql 的七种 join sql 编写

首先创建两张表 CREATE TABLE `t_user` ( `id` bigint(16) NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, `age` int(4) NOT NULL, `gender` tinyint(2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 CREATE TABLE `cust