ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle的存储过程

Oracle的存储过程

原创 Linux操作系统 作者:jhondom 时间:2013-05-01 11:08:46 0 删除 编辑
Oracle通过存储过程来体现商业规则和业务逻辑,存储过程是SQL,PL/SQL,Java语句的组合,这样代码存储一次就能够被多次使用。
要创建一个过程对象(procedural object),必须有create procedure系统权限。如果这个被其他schema使用,那么你必须有create any procedure权限。执行procedure的时候,可能需要execute权限。或者execute any procedure权限。如:
grant execute on MY_PROCEDURE to jelly
调用存储过程:
execute MY_PROCEDURE('ONE PARAMETER');
存储过程和函数的区别:
Function有返回值,并可以直接在Query中引用function或者使用function的返回值。本本质上没有区别,都是PL/SQL程序,都可以有返回值,根本区别是:存储过程是命令,二而函数是表达式的一部分。如:
select max(AGE) from table;
但是不能是exec max(NAME).
Package是function,procedure,variables和sql语句的组合。允许多个procedure使用同一个变量和游标。创建procedure的语法:
CREATE [OR REPLACE] PROCEDURE [schema.]procedure
[(argument [IN |OUT| IN OUT][NO COPY] datetype [,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代码:
CREATE PROCEDURE sam.credit(acc_no IN NUMBER,amount IN NUMBER) AS
BEGIN
      UPDATE accounts
      SET balance=balance+account
      WHERE account_id=acc_no;
END;
IN:调用者对变量赋值后传入到procedure进行处理。
OUT:procedure通过这个变量将值返回给调用者。
IN OUT:两者的结合。
 
 
 
Oracle存储过程的基本语法形式:
1.基本结构:
create or replace procedure prodedure_name
(parameter1 IN NUMBER,
parameter2 IN NUMBER
) AS
variable1 INTEGER:=0;
variable2 DATE;
BEGIN
    procedure_name;
END;
 
2.SELECT INTO STATEMENT
将select的查询结果存入到变量中,可以将多个列存储到多个变量中。其中必须有一条记录否则会抛出异常。
BEGIN
SELECT col1,col2 INTO variable1,variable2 FROM typestruct WHERE xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx
END;
....
 
3.IF判断
IF variable=1 THEN
BEGIN
   xxxxx
END;
END IF;
 
4.WHILE循环
WHILE variable=1 LOOP
BEGIN
  xxxxx
END;
END LOOP;
 
5.变量赋值:
    variable:=123456;
 
6.使用FOR IN .....CURSOR
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cursor_result IN cur LOOP
BEGIN
V_SUM:=cursor_result.col1+cursor_result.col2
END;
END LOOP;
END;
 
7.带参数的CURSOR
CURSOR cur_user(cur_id NUMBER) IS SELECT name FROM USERS WHERE typeid=cur_id;
OPEN cur_user(variable1);
LOOP
FETCH cur_user INTO variable1;
EXIT FETCH cur_user%NOT FOUND;
xxxx
END LOOP;
CLOSE cur_user;
 
8.pl/sql中的存储过程
DECLARE
var1.....
var2.....
BEGIN
EXECUTE procedure_name(parameter1,parameter2...)
END;
sqlplus中调用方法:
SQL>set serveroutput on;
SQL>variable info1 NUMBER;
SQL>variable info2 NUMBER;
SQL>DECLARE
         var1 VARCHAR2(10);
         var2 VARCHAR2(20);
         var3 VARCHAR2(30);
         BEGIN
              procedure(var1,var2,var3,:info1,:info2);
         END;
SQL>print info1;
SQL>print info2;
 
文章来自网络,供学习之用。如有侵权,第一时间删除。
 
 
 
 
 

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

下一篇: Oracle的跟踪事件
请登录后发表评论 登录
全部评论

注册时间:2013-04-21

  • 博文量
    15
  • 访问量
    23137