PL/SQL 子程序 -- 存储过程

来源:互联网 发布:淘宝开放平台开发 编辑:程序博客网 时间:2024/06/08 15:13

-- Start

子程序其实就是一个有名字的语句块,有两种类型的子程序,存储过程和函数。它们之间的区别是函数有返回值而存储过程没有。

嵌套存储过程(Nested Procedure)

一个存储过程可以定义在匿名块或另一个子程序中,我们把它叫做嵌套存储过程。

DECLARE    ming    varchar2(20) := 'Bo';    xing    varchar2(20) := 'Shang';          -- 定义嵌套存储过程    PROCEDURE print(      first_name    varchar2, -- 注意,此处参数不能指定长度哦      last_name     varchar2    )    IS    -- 在此处申明变量    full_name varchar2(40);  BEGIN    full_name :=  last_name || ' ' || first_name;    DBMS_OUTPUT.PUT_LINE('My name is ' || full_name);    END print;    BEGIN    -- 调用存储过程方式一    print(ming, xing);        -- 调用存储过程方式二    print(first_name => ming, last_name => xing);  END;

独立存储过程(Standalone Procedure)

一个存储过程还可以定义在模式(schema)中,我们把它叫做独立存储过程。

-- 定义独立存储过程CREATE OR REPLACE PROCEDURE concatenate_name (  first_name         varchar2, -- 默认是输入参数  last_name  IN      varchar2 := 'unknown', -- 输入参数同时定义了默认值  full_name  IN OUT  varchar2, -- 输入输出参数  error_code OUT     number --输出参数)ISBEGIN  -- 检查输入参数  IF first_name IS NULL OR last_name IS NULL THEN     full_name := '未知'; -- 给输出参数赋值    error_code := -1;    return; -- 返回  END IF;  full_name := last_name || ' ' || first_name;END;DECLARE  ming    varchar2(20) := 'bo';  xing    varchar2(20) := 'Shang';  xing_ming  varchar2(40);  error_code number(1);BEGIN  -- 调用存储过程  concatenate_name(ming, xing, xing_ming, error_code);  IF error_code < 0 THEN     return;  END IF;    DBMS_OUTPUT.PUT_LINE(xing_ming);END;/


包存储过程 (Package Procedure)

一个存储过程还可以定义在包(package)中,我们把它叫做包存储过程。

-- 声明包CREATE OR REPLACE PACKAGE util ASPROCEDURE print(first_name varchar2, last_name varchar2);END util;-- 定义包CREATE PACKAGE BODY util AS  --定义包存储过程PROCEDURE print(  first_name    varchar2,  last_name     varchar2  )  IS  BEGIN  DBMS_OUTPUT.PUT_LINE('My name is ' || last_name || ' ' || first_name);  END print;END util;-- 测试包存储过程DECLARE    ming    varchar2(20) := 'Bo';  xing    varchar2(20) := 'Shang';BEGIN    -- 调用包存储过程    util.print(ming, xing); END;

重载存储过程

像 Java 一样,存储过程也是可以重载的,它特别适用于包存储过程,这样我们就可以使用同一个 API 根据不同的参数处理不同的事情。


--更多参见:Oracle PL/SQL 精萃

-- 声明:转载请注明出处

-- Last Edited on 2015-06-02

-- Created by ShangBo on 2015-01-22

-- End


0 0
原创粉丝点击