整理于尚硅谷资料。
建立存储过程
在ORACLE SERVER上建立存储过程,可以被多个应用程序调用,可以向存储过程传递参数,也可以向存储过程传回参数。
创建过程语法:
CREATE [OR REPLACE] PROCEDURE Procedure_name [(argment [ { IN | IN OUT }] Type, argment[ { IN | OUT | IN OUT } ] Type ] [AUTHID DEFINER | CURRENT_USER ] { IS | AS } |
<类型.变量的说明> BEGIN |
<执行部分> EXCEPTION |
<可选的异常错误处理程序> END; |
例 7.删除指定员工记录
例 8.插入员工记录 |
调用存储过程
ORACLE使用 EXECUTE语句来实现对存储过程的调用:
EXEC[UTE] Procedure_name(parameter1, parameter2…);
例 9:查询指定员工记录;
调用方法
例 10.计算指定部门的工资总和,并统计其中的职工数量。
调用函数
authid
在创建存储过程时,可使用 AUTHID CURRENT_USER或 AUTHID DEFINER选项,以表明在执行该过程时Oracle使用的权限。
一.如果使用 AUTHID CURRENT_USER选项创建一个过程,则Oracle用调用该过程的用户权限执行该过程。
为了成功执行该过程,调用者必须具有访问该存储过程体中引用的所有数据库对象所必需的权限。
二.如果用默认的 AUTHID DEFINER选项创建过程,则 Oracle使用过程所有者的特权执行该过程。
为了成功执行该过程,过程的所有者必须具有访问该存储过程体中引用的所有数据库对象所必须的权限。
想要简化应用程序用户的特权管理,在创建存储过程时,一般选择 AUTHID DEFINER选项 ––这样就不必授权给需要调用的此过程的所有用户了。
开发存储过程步骤 |
开发存储过程、函数、包及触发器的步骤如下: |
1 |
使用文字编辑处理软件编辑存储过程源码 |
使用文字编辑处理软件编辑存储过程源码,需将源码存为文本格式。 |
2 |
在 SQLPLUS或用调试工具将存储过程程序进行解释 在 SQLPLUS或用调试工具将存储过程程序进行解释; 在 SQL>下调试,可用 START或 GET等 ORACLE命令来启动解释。如: SQL>START c:\\stat1.sql |
3 |
调试源码直到正确 |
我们不能保证所写的存储过程达到一次就正确。所以这里的调式是每个程序员必须进行的工作之一。 |
在 SQLPLUS下来调式主要用的方法是: |
1)使用 SHOWERROR命令来提示源码的错误位置; |
2)使用 user_errors数据字典来查看各存储过程的错误位置。 |
4 |
授权执行权给相关的用户或角色 |
如果调式正确的存储过程没有进行授权,那就只有建立者本人才可以运行。所以作为应用系统的一部 |
分的存储过程也必须进行授权才能达到要求。在 SQL*PLUS下可以用 GRANT命令来进行存储过程的运行授 |
权。 |
GRANTEXECUTE ON dbms_job TO PUBLIC WITH GRANT OPTION |
5 |
与过程相关数据字典 |
USER_SOURCE, ALL_SOURCE,DBA_SOURCE,USER_ERRORS |
相关的权限: CREATEANY PROCEDURE DROPANY PROCEDURE |
在 SQL*PLUS中,可以用 DESCRIBE命令查看过程的名字及其参数表。 DESCRIBEProcedure_name; |
1.删除过程 |
可以使用 DROP PROCEDURE命令对不需要的过程进行删除,语法如下: |
DROPPROCEDURE [user.]Procudure_name; |
2.删除函数 |
可以使用 DROP FUNCTION命令对不需要的函数进行删除,语法如下: |
DROPFUNCTION [user.]Function_name; |
例题:
26. 定义一个存储过程: 获取给定部门的工资总和(通过 out 参数), 要求:部门号和工资总额定义为参数
create or replace procedure sum_sal_procedure(dept_id number, v_sum_sal out number)
is
cursor sal_cursor is select salary from employees where department_id = dept_id;
begin
v_sum_sal := 0;
for c in sal_cursor loop
–dbms_output.put_line(c.salary);
v_sum_sal := v_sum_sal + c.salary;
end loop;
dbms_output.put_line(\’sum salary: \’ || v_sum_sal);
end;
[执行]
declare
v_sum_sal number(10) := 0;
begin
sum_sal_procedure(80,v_sum_sal);
end;
27. 自定义一个存储过程完成以下操作:
对给定部门(作为输入参数)的员工进行加薪操作, 若其到公司的时间在(? , 95) 期间,为其加薪 %5
[95 , 98) %3
[98, ?) %1
得到以下返回结果: 为此次加薪公司每月需要额外付出多少成本(定义一个 OUT 型的输出参数).
create or replace procedure add_sal_procedure(dept_id number, temp out number)
is
cursor sal_cursor is select employee_id id, hire_date hd, salary sal from employees where department_id = dept_id;
a number(4, 2) := 0;
begin
temp := 0;
for c in sal_cursor loop
a := 0;
if c.hd < to_date(\’1995-1-1\’, \’yyyy-mm-dd\’) then
a := 0.05;
elsif c.hd < to_date(\’1998-1-1\’, \’yyyy-mm-dd\’) then
a := 0.03;
else
a := 0.01;
end if;
temp := temp + c.sal * a;
update employees set salary = salary * (1 + a) where employee_id = c.id;
end loop;
end;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29074224/viewspace-2124175/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29074224/viewspace-2124175/