您的位置:首页 > 数据库 > Oracle

Oracle的存储过程

2016-08-15 09:56 453 查看

定义(做什么)

存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数)来执行它。

存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程,存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后 存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包。

优点(有什么用)

存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

存储过程可以重复使用,可减少数据库开发人员的工作量。

安全性高,可设定只有某用户才具有对指定存储过程的使用权。

存储过程的创建(语法)

create [or replace] procedure pro_name[(parameter1[,parameter2]...)] is|as
begin
plsql_sentences;
[exception]
[dowith_sentences;]
end [pro_name];


注解:

1. pro_name:存储过程的名称

2. parameter1:存储过程的参数。若是输入参数,则需要在其后指定”in”关键字;若是输出参数,则需要在其后指定”out”关键字。在int或out后面是参数的数据类型,但不能指定该类型的长度

3. plsql_sentences:PL/SQL语句,它是存储过程功能的实现主体。

4. dowith_sentences:异常处理语句,也是PL/SQL语句。

5. []:可选语句项,视具体情况选择。

6. is|as:is和as选一个即可

注意:语法中的 parameter1是存储过程被调用/执行时用到的参数,而不是存储过程内定义的内部变量,内部变量要在is|as后面定义,并使用分号结束。

实例

无参存储过程

create or replace procedure pro_insertDept is
begin
insert into dept values(33,'','');
end;


带参存储过程

create or replace procedure runbyparmeters
(isal in emp.sal%type,
sname out varchar,
sjob in out varchar)
as
icount number;
begin
select count(*) into icount from emp where sal>isal and job=sjob;
if icount=1 then
....
else
....
end if;
exception
when too_many_rows then
DBMS_OUTPUT.PUT_LINE('返回值多于1行');
when others then
DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');
end;


在Oracle中对存储过程的调用

过程调用方式一

declare
realsal emp.sal%type;
realname varchar(40);
realjob varchar(40);
begin   //过程调用开始
realsal:=1100;
realname:='';
realjob:='CLERK';
runbyparmeters(realsal,realname,realjob);--必须按顺序
DBMS_OUTPUT.PUT_LINE(REALNAME||'   '||REALJOB);
END;  //过程调用结束


过程调用方式二

declare
realsal emp.sal%type;
realname varchar(40);
realjob varchar(40);
begin    //过程调用开始
realsal:=1100;
realname:='';
realjob:='CLERK';
--指定值对应变量顺序可变
runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob);
DBMS_OUTPUT.PUT_LINE(REALNAME||'   '||REALJOB);
END;  //过程调用结束


过程调用方式三(SQL命令行方式下)

1、SQL>exec  proc_emp('参数1','参数2');//无返回值过程调用
2、SQL>var vsal number
SQL> exec proc_emp ('参数1',:vsal);// 有返回值过程调用
或者:call proc_emp ('参数1',:vsal);// 有返回值过程调用


JAVA调用Oracle存储过程

(1)不带输出参数情况,过程名称为pro1,参数个数1个,数据类型为整形数据

import java.sql.* ;
public class ProcedureNoArgs{
public static void main(String args[]) throws Exception{
//加载Oracle驱动
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//获得Oracle数据库连接
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ");
//创建存储过程的对象
CallableStatement c = conn.divpareCall("{call pro1(?)} ");
//给Oracle存储过程的参数设置值 ,将第一个参数的值设置成188
c.setInt( 1 , 188 );
// 执行Oracle存储过程
c.execute();
conn.close();
}
}


(2)带输出参数的情况,过程名称为pro2,参数个数2个,数据类型为整形数据,返回值为整形类型。

import java.sql.*;
public class ProcedureWithArgs {
public static void main(String args[]) throws Exception{
//加载Oracle驱动
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//获得Oracle数据库连接
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ");
//创建Oracle存储过程的对象,调用存储过程
CallableStatement c=conn.divpareCall("{call pro2(?,?)}");
//给Oracle存储过程的参数设置值 ,将第一个参数的值设置成188
c.setInt(1,188);
//注册存储过程的第二个参数
c.registerOutParameter(2,java.sql.Types.INTEGER);
c.execute(); //执行Oracle存储过程
//得到存储过程的输出参数值并打印出来
System.out.println (c.getInt(2));
conn.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 存储