存储过程

过程定义:
    CREATE [OR REPLACE] PROCEDURE procedure_name
    [(part_name [ IN | OUT | IN OUT] datetype... )]
    [AUTHID DEFINER | CURRENT_USER]
    IS | AS
    BEGIN
    procedure_body
    END


例:定义一个过程,以job作为参数,显示该job平均工资、最高工资和最低工资
    CREATE OR REPLACE PROCEDURE disp_job_sal(v_job scott.emp.job%type)
    AS
        max_sal scott.emp.sal%type;
        min_sal scott.emp.sal%type;
        avg_sal scott.emp.sal%type;
    BEGIN
        select avg(sal),max(sal),min(sal) into avg_sal,max_sal,min_sal
            from scott.emp where job=v_job;
        dbms_output.put_line(v_job||' avg sal:'||avg_sal);
        dbms_output.put_line(v_job||' max sal:'||max_sal);
        dbms_output.put_line(v_job||' min sal:'||min_sal);
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            dbms_output.put_line('No data found!');
    END disp_job_sal;
    /
    


过程调用、运行
    call | execute procedure_name(part_list);


存储过程运行权限要求:

    1、运行一个过程时,默认是以定义者的权限来访问相关表,所以即便运行无法访问存储过程涉及到的表,
      过程也能运行,如果要改变这种方式在定义过程时加 AUTHID CURRENT_USER
      如:
    CREATE OR REPLACE PROCEDURE disp_job_sal2
    AUTHID CURRENT_USER

    2、存储过程编译时,不能使用角色授权,在运行时同样不能使用角色授权

与存储过程相关的数典:
    dba_source
    dba_objects
    dba_dependencies


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

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

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

查看存储过程依赖表
    SQL> select REFERENCED_TYPE,REFERENCED_OWNER,REFERENCED_NAME from dba_dependencies
      2  where NAME='DISP_JOB_SAL';

存储过程参数传递方式:
        存储过程参数传递方式有两种:
        按位置传递: 知道每一个参数的名字,依次给值
        按名字传递:不需要按参数顺序一一对应,在传参数归,输入参数名,再给值

    例:创建了过程
    create ... inser_emp(empno,ename,sal,deptno)

    按位置传:
    exec inser_emp(8000,'test',2500,10)

    按名字传

    exec inser_emp(ename=>'test',empno=>8000,sal=>2500,deptno=>0)


默认参数
     默认参数即调用时不给参数传值,这个参数的值是多少
    默认参数必须在创建时定义
    定义方法:
    定义参数时,为其赋值

    例:写一个过程,显示部门平均工资,最高工资、最低工资,同时部门号设置一个默认参数,
       如果不指定就默认为10号部门
   
   
CREATE OR REPLACE PROCEDURE disp_dept_sal(d_no scott.emp.deptno%type:=10)
AUTHID CURRENT_USER
AS
    max_sal scott.emp.sal%type;
    min_sal scott.emp.sal%type;
    avg_sal scott.emp.sal%type;
BEGIN
    select avg(sal),max(sal),min(sal) into avg_sal,max_sal,min_sal from scott.emp where deptno=d_no;
    dbms_output.put_line(d_no||' avg sal:'||avg_sal);
    dbms_output.put_line(d_no||' max sal:'||max_sal);
    dbms_output.put_line(d_no||' min sal:'||min_sal);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        dbms_output.put_line('No data found!');
END;
/

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值