• Oracle 的过程与函数


    一、过程

           1 、过程创建和调用

           过程 (procedure) 是一个 PL/SQL 语句块,它存储在数据字典中并可被应用程序调用。可以使用过程存储数据库中频繁使用的应用逻辑。当执行一个过程时,其语句被作为一个整体执行。过程不将任何值返回调用程序。

           使用存储过程的一个好处就是能够实施数据的安全性。可以使不授权用户直接访问应用程序中的一些表,而授权用户执行访问这些表的一个过程。当执行过程时,他将以过程拥有者的权限来执行。除非通过过程,否则用户就不能访问这些表。

           创建过程语句的语法如下

           CREATE [OR REPLACE] PROCEDURE 过程名称

           [( 参数 [{IN | OUT | IN OUT}] 类型,

           …

           参数 [{IN | OUT | IN OUT}] 类型 )]

           [AUTHID {CURRENT_USER | DESIGNER}]

           {IS | AS}

           过程体

           在 CREATE 关键字后加上 OR REPLACE 关键字是为了允许将撤销和重建这两步操作合并为一个操作。因为在创建一个过程时,有可能这个过程已存在。为了修改过程的代码,首先必须将该过程撤销,然后再重建。由于这种操作已经是开发过程的标准方式,所以关键字 OR REPLACE 允许将撤销和重建这两步操作合并为一个操作。

           和其他的 CREATE 语句一样,创建过程是一种 DDL 操作。

           在过程和函数中没有使用关键字 DECLARE ,取而代之的是关键字 IS 或 AS 。这种语法风格是 PL/SQL 从 Ada 语言中继承下来的。

    综上所述,过程的结构应具有下面所示的特征

    CREATE OR REPLACE PROCEDURE 过程名称 [ 参数列 ] AS

    /* 声明部分在这里 */

    BEGIN

    /* 可执行部分在这里 */

    EXCEPTION

    /* 异常部分在这里 */

    END [ 过程名称 ];

           过程名可以写在过程声明中最后一个 END 语句之后。如果在该 END 语句之后有标识符,该标识符一定要与该过程名匹配。

    下面给出一个创建过程的简单例子,用于打印当前时间

    CREATE OR REPLACE PROCEDURE print_current_time AS

    CURTIME VARCHAR2(20);

    BEGIN

    SELECT TO_CHAR(sysdate, ‘yyyy/mm/dd hh24:mi:ss’)

                  INTO CURTIME

           FROM dual;

    DBMS_OUTPUT.put_line(‘ 当前时间 : ’||CHR(9)||CURTIME);

    END print_current_time;

    /

    在 PL/SQL 中,调用过程有以下两种方式

    * 直接利用 EXECUTE 命令

    EXECUTE print_current_time;

    * 在 PL/SQL 块中调用
    declare
    begin
      print_current_time;
    end;

     

     

           2 、过程参数设置与传递

           下面是一个带参数过程的简单例子。

           CREATE OR REPLACE PROCEDURE print_parameter

           (param1 IN VARCHAR2 DEFAULT NULL) AS

           BEGIN

           IF (param1 IS NULL) THEN

           DBMS_OUTPUT.put_line(‘ 你没输入参数 ’);

           ELSE

           DBMS_OUTPUT.put_line(‘ 你输入的参数是: ’||CHR(9)||param1);

           END IF;

           END print_parameter;

     

           形参可以有 3 种模式 : IN 、 OUT 或 IN OUT 。如果没有为形参指定模式,其默认模式为 IN 。

           IN :该值具有只读属性,不能对其修改。当该过程结束时,控制将返回到调用环境,这时,对应的实参没有改变。

           OUT :该变量具有读写属性。当该过程结束时,控制将返回调用环境,形参的内容将被赋予对应的实参。

           IN OUT :该模式是模式 IN 和 OUT 的组合。调用过程时,实参的值将被传递到该过程中。在过程内部,形参相当于初始化的变量,并具有读写属性。当该过程结束时,控制将返回调用环境中,形参的内容将被赋予实参。

     

           在过程的声明中,不能强制指定参数 CHAR 和 VARCHAR2 的长度,以及指定 NUMBER 参数的精度或小数点后倍数。这样是非法的,因为这些限制可以从实参中获得。

     

           PL/SQL 的默认方式是对参数 IN 执行按引用传递,而对参数 OUT 、 IN OUT 执行按值传递。另外,使用 NOCOPY 编译器将按引用传递参数,而不是按值传递。

     

     

    二、函数的创建、查询和调用

           与过程一样,函数也带有参数,是存储在数据库中的代码块。其差别在于函数可以把值返回调用程序,可以在 SQL 语句中调用它们。一般的调用方式是:过程调用本身是一个 PL/SQL 语句,而函数调用是作为表达式的一部分执行的。

           语法如下:

           CREATE [OR REPLACE] FUNCTION 函数名称

           [( 参数 [{IN | OUT | IN OUT}] 数据类型,

           …

           参数 [{IN | OUT | IN OUT}] 数据类型 )]

           [AUTHID {CURRENT_USER | DESIGNER}]

           {IS | AS}

           函数体

     

           返回语句: RETURN 返回值

           当执行该语句时,如果表达式的类型与定义不符,该表达式将被转换为函数定义子句 RETURN 中指定的类型。

     

           创建一个函数,确定一个数是奇数还是偶数。

           CREATE OR REPLACE FUNCTION EVEN_ODD

           (p_Number IN NUMBER)

           RETURN VARCHAR2 IS

           RETVAL VARCHAR2(5);

           BEGIN

           IF (p_Number MOD 2) = 0 THEN

           RETVAL:=’EVEN’;

           ELSE

           RETVAL:=’ODD’;

           END IF;

           RETURN RETVAL;

           END EVEN_ODD;

           /

     

           可以用 SELECT 语句进行查询:

           SELECT EVEN_ODD(29) FROM DUAL;

           对函数的调用一般在作为表达式的那部分进行,如:

           DBMS_OUTPUT.put_line(EVEN_ODD(a_number));

     

     

    三、删除过程和函数

           DROP PROCEDURE 过程名称;

           DROP FUNCTION 函数名称;

  • 相关阅读:
    project euler 开坑
    hdu 5382 GCD?LCM!
    Leetcode 557. 反转字符串中的单词 III
    Leetcode 344. 反转字符串
    Leetcode 345. 反转字符串中的元音字母
    008.C++类改写模板类
    007.C++构造函数
    006.C++头文件
    02.树的序列化与反序列化(C++)
    Leetcode 94. 二叉树的中序遍历
  • 原文地址:https://www.cnblogs.com/wzh123/p/3393018.html
Copyright © 2020-2023  润新知