过程定义:
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;
/
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/