函数和包

定义函数
    CREATE OR REPLACE FUNCTION function_name
    [(part_name datatype [...])]
    RETURN datatype
    IS|AS
    BEGIN
    function_body
        return value
    END;


    RETURN datatype 不需要精确指定,如 number 就不需要写成 number(5,2),只写成 number就可以了

    例:定义一个函数,返回一个指定部门的平均工资
    
    CREATE OR REPLACE FUNCTION disp_dept_sal3(d_no scott.emp.deptno%type)
    RETURN scott.emp.sal%type
    AS
        avg_sal scott.emp.sal%type;
    BEGIN
        select avg(sal) into avg_sal from scott.emp where deptno=d_no;
        return avg_sal;
    EXCEPTION
        when no_data_found then
        return -1;
    END;
    /   

   
函数调用:
    直接在表达式中使用,即可


函数加密
    1、把创建过程用脚本保存,不要直接在sqlplus 去建

    2、用wrap对创建过程的脚本加密
     wrap iname=create_pro.sql name=aa.sql
             原始文件名              加密后的文件名

    3、拿这个加密后的脚本去运行,来创建存储过程


与函数相关的数据字典:
    dba_source
    dba_objects

参数传递方式
    与过程相同

函数删除
    DROP FUNCTION  function_name

      SQL> drop function disp_dept_sal3;
 



    包是将一些plsql对象,如过程、函数封装在一起

包的构成:
    包由两个部分构成:
    包头
        对包的声明,说明包中有哪些对象,至于对象的实现不管

    包体
        对包头声明对象的实现,只要包头声明过的对象,包体都要有相应的实现代码

包头创建:
    CREATE OR REPLACE PACKAGE package IS|AS

    包对象声明

    END

    例:   

    CREATE OR REPLACE PACKAGE mytest AS
        procedure disp_dept_sal(d_no scott.emp.deptno%type);
        function disp_dept_sal2(d_no scott.emp.deptno%type) return scott.emp.sal%type;
    END;
    /


包体的创建:
    CREATE OR REPLACE PACKAGE BODY package IS|AS

    包头声明的每个对象的代码,每个对象完了以后,要有END结束,如
   
    FUNCTION ....

    END;

    PROCEDURE ...


    END;
   
  
    END;
    /


    例:

CREATE OR REPLACE PACKAGE BODY mytest AS
    procedure disp_dept_sal(d_no scott.emp.deptno%type)
    as
        v_sal scott.emp.sal%type;
    begin
        select avg(sal) into v_sal from scott.emp where deptno=d_no;
        dbms_output.put_line(d_no||' avg sal: '||v_sal);
    exception
        when no_data_found then
            dbms_output.put_line('No data found!');
    end;

    function disp_dept_sal2(d_no scott.emp.deptno%type)
    return scott.emp.sal%type
    as
        v_sal scott.emp.sal%type;
    begin
        select max(sal) into v_sal from scott.emp where deptno=d_no;
        return v_sal;
    end;
END;
/

包的使用:
    与单独对象相似,但具体指明哪个包,包中的哪个对象,如:
    exec 包名.包中对象名

    exec mytest.disp_dept_sal(10);
    select mytest.disp_dept_sal2(20) from dual;

   
与包相关的数据字典:
    dba_objects
    dba_source

包加密
    与过程一样

删除包
    包的删除可以只删除包体,保留包头,但不能只删除包头,保留包体

    删除包体
    DROP PACKAGE BODY package_name

    包头包体一起删:
    DROP PACKAGE package_name

包的重载:
    包中包含多个同名的对象,对象名相同,但参数个数或参数数据类型不一样

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21175589/viewspace-755685/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21175589/viewspace-755685/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值