虽说自己的工作整体跟存储过程打交道,但是对于存储过程的定义一直不太全面,今天看到了一篇好文章,转载过来,供大家学习;
来自:http://jelly.iteye.com/blog/60314
商业规则和业务逻辑可以通过程序存储在oracle中,这个程序就是存储过程。
存储过程是SQL, PL/SQL, JAVA 语句的组合, 它使你能将执行商业规则的代码从从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。
要创建一个 过程对象(procedural object),必须有 CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有 CREATE ANY PROCEDURE 权限。
执行 procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。
如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly
调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER');
PROCEDURE 和 FUNCTION 的区别。 function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。
PACKAGE 是function,procedure,variables 和sql 语句的组合。package允许多个procedure使用同一个变量和游标。
创建 procedure的语法:
CREATE [ OR REPLACE ] PROCEDURE [ schema.]procedure
[(argument [IN | OUT | IN OUT ] [NO COPY] datatype
[, argument [IN | OUT | IN OUT ] [NO COPY] datatype]...
)]
[ authid { current_user | definer }]
{ is | as } { pl/sql_subprogram_body |
language { java name 'String' | c [ name, name] library lib_name
}]
可以使用 create or replace procedure 语句, 这个语句的用处在于,你之前赋予的excute权限都将被保留。
IN, OUT, IN OUT 用来修饰参数。IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。OUT 表示PRCEDURE 通过这个变量将值传回给调用者。IN OUT 则是这两种的组合。
authid代表两种权限: 定义者权限(difiner right 默认),执行者权限(invoker right)。定义者权限说明这个procedure中涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问。执行者权限则需要调用这个procedure的用户拥有相关表和对象的权限。
Oracle规定,在默认的情况下,在调用存储过程用户的角色不起作用,即在执行存储过程时只有Public权限。所以在调用Create table时,会有权限不足的提示。
存储过程分为两种,即DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。比如说用户sh创建了删除表mytable的存储过程drop_table(),当用户sh调用时,删除用户sh下的表mytable;如果是另一个用户scott调用呢?是删除用户scott下的mytable表呢,还是删除用户sh的mytable呢?另外,如果存储过程中包含建表语句,不管是用户sh还是用户scott调用都会失败,因为Public没有建表权限,除非为Public grant建表权限。所以,存储过程的调用者会面临两个问题:
存储过程的名称解析环境
存储过程的执行权限
这两个问题可以在定义存储过程时,通过指定AUTHID 属性,即定义DR Procedure 和IR Procedure来解决。
DR Procedure
1、定 义
CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID DEFINER as
...
BEGIN
...
END DEMO;
2、名称解析环境为定义该存储过程的用户所在的Schema。
3、执行该存储过程时只有Public权限。
IR Procedure
1、定 义
CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as
...
BEGIN
...
END DEMO;
2、名称解析环境为调用该存储过程的用户所在的Schema。
3、执行该存储过程时拥有调用者的所有权限,即调用者的Role是有效的。