存储过程(扫盲文章)

虽说自己的工作整体跟存储过程打交道,但是对于存储过程的定义一直不太全面,今天看到了一篇好文章,转载过来,供大家学习;

来自: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
}]

sql 代码
  1. CREATE PROCEDURE sam.credit (acc_no IN NUMBER, amount IN NUMBER) AS    
  2.    BEGIN  
  3.       UPDATE accounts    
  4.       SET balance = balance + amount    
  5.       WHERE account_id = acc_no;    
  6.    END;  

 

可以使用 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是有效的。

你可能感兴趣的:(oralce,procedure,store)