《PL/SQL 语言开发参考手册》之七:SUB PROGRAM

《PL/SQL 语言开发参考手册》之七:SUB PROGRAM

《PL/SQL 语言开发参考手册》下载地址
        1、SUB-PROGRAM
                1)匿名块 不存在于数据库中,每次运行,数据库都要再编译,再运行,不能在其他块中相互调用
                2)带名块 储存在数据库中,可以在任何需要的地方调用,可以做到代码重用(procedure(程序)、function(函数)、 package(包)、trigger(触发器))
        2、存储过程(PROCEDURE)        
                创建过程:

CREATE [OR REPLACE] PROCEDURE proc_name(代码块名) [ (arg_name [ {IN|OUT|IN OUT} ] TYPE, arg_name [ {IN|OUT|IN OUT} ] TYPE ) ] {IS|AS} PROCEDURE_BODY(过程主体)  
                        1)[OR REPLACE]:如果数据库中存在这个名字就先 DROP 再创建(覆盖)
                        2)[(arg_name[{IN|OUT|IN OUT}]TYPE,arg_name[{IN|OUT|IN OUT}]TYPE)] 参数列表;
                        其格式:(参数名1 {IN|OUT|IN OUT} 类型,参数名2 {IN|OUT|IN OUT} 类型 , ...)
                        3){IS|AS} 关键字,二者必须要选择其一。
                参数列表:
                        1)IN 模式:表示该参数不能被过程赋值(只能位于等号右边),只能由调用者在调用时输入值;
                        2)OUT 模式:表示该参数只能被过程赋值(只能位于等号左边),调用者不用传递参数值;
                        3)IN OUT 模式:表示该类型既能被过程赋值也能被调用者传值;
                        4)参数缺省为 IN 模式
                PROCEDURE_BODY
                        1)过程主体是一个拥有声明,执行和异常处理的完整的 PL/SQL 块
                        2)声明部分在 IS 或 AS 关键字与 BEGIN 关键字之间
                        3)执行部分在 BEGIN 和 EXCEPTION 之间
                        4)异常处理在 EXCEPTION 和 END 之间
        3、存储过程例子

 

CREATE OR REPLACE PROCEDURE ModeTest ( p_InParm IN NUMBER, p_OutParm OUT NUMBER, p_InOutParm IN OUT NUMBER) IS v_LocalVar NUMBER; /* 声明部分 */ BEGIN v_LocalVar:=p_InParm; /* 执行部分 */ p_OutParm:=7; p_InOutParm:=7; ... EXCEPTION ... /* 异常处理部分 */ END ModeTest;  
        4、调用 PROCEDURE 的例子
                1)匿名块可以调;
                2)其他 PROCDEURE 可以调用;
                例:

DECLARE v_var1 NUMBER; BEGIN ModeTest(12, v_var1, 10); /* 调用3中的ModeTest块 */ END;  
                注:此时 v_var1 等于 7
        5、指定实参的模式
                1)位置标示法:调用时添入所有参数,实参与形参按顺序一一对应;

ModeTest(12, v_var1, 10); /* 顺序不能错 */ 
                2)名字标示法:调用时给出形参名字,并给出实参

ModeTest(p_InParm=>12, p_OutParm=>v_var1, p_Inout=>10); /* 4 中的调用方法 */ p_OutParm=>v_var1 形参 => 实参 /* 这样方法可以不考虑参数的位置 */ 
                注:
                        a、两种方法可以混用,但混用时第一个参数必须通过位置来指定。
                        b、名字标记法对于参数很多的时候可提高程序的可读性
        6、使用缺省参数
                1)形参可以指明缺省值

parm_name [mode] type { := | DEFAULT } init_value  
                2)位置标记法时,所有的缺省值都放在最后面,使用名字标示法则无所谓
                3)如果使用的缺省值,尽量将缺省值放在参数表的末尾
        7、函数(Function)与过程(Procedure)的区别
                函数在所有的地方都与过程相似,都有名字,都有统一的形式:声明,执行与异常处理
                都可以存储在数据库中,也都可以声明在无名块的内部,函数可以看做是过程的一种特殊情况。
                差别:
                        1)过程调用本身是一个 PL/SQL 语句(可以在命令行中通过 exec 语句直接调用);
                        2)函数调用是表达式的一部分;
        8、函数的声明        

CREATE [OR REPLACE] PROCEDURE proc_name [(arg_name[{IN|OUT|IN OUT}]TYPE, arg_name[{IN|OUT|IN OUT}]TYPE)] RETURN TYPE {IS|AS} procedure_body 
                注:
                        1)没有返回语句的函数将是一个错误;
                        2)在函数的主体内部,return 语句用来将控制通过一个数值返回给调用环境
                        3)在一个函数的主体中,可以使用多个 RETURN 返回语句
        9、删除过程与函数

DROP PROCEDURE proc_name; DROP FUNCTION func_name;  
    10、子程序
                1)位置:
                        a、Store subprogram 通过 CREATE OR REPLACE 命令创建,以编译后的形式存放在数据库中
                        b、本地子程序 没有 CREATE OR REPLACE 关键字,不由 CREATE FUNCTION 开头
                        子程序的定义放在无名块的声明部分且本地子程序只能是本地调用,其他块不能调用
                2)例:

DECLARE v_var VARCHAR2; FUNCTION func (p_Fname IN VARCHAR2, p_Lname IN VARCHAR2) RETURN VARCHAR2 IS BEGIN ....(本地子程序主体) END func ; BEGIN v_var := func('First Name' , 'Last Name' ); .... ; END;

你可能感兴趣的:(《PL/SQL 语言开发参考手册》之七:SUB PROGRAM)