编写存储过程入门


存储过程的 概念:

存储过程:就是一PLSQL语句包装起来,起个名称

语法上:相当于plsql语句戴个帽子。

相对而言:单纯plsql可以认为是匿名程序。

 

存储作用:

1, 在开发程序中,了一个特定的业务功能,会向数据库进行多次连接关闭(连接和关闭是很耗费资源)就需要对数据库进行多次I/O写,性能比较低。如果把这些业务PLSQL在应用程序中只需要调用PLSQL就可以做到连接关闭一次数据库就可以实现我们的业务,可以大大提高效率.

 

2, ORACLE方给的建议:够让数据库操作的不要放在程序中数据库中实基本上不会出现错误,在程序中操作可以会存在错误.(如果在数据库中操作数据,可以有一定的日志恢复等功能.)

提示:

l plsql存储过程的基础。

l java是不能直接调用plsql的,但可以通过存储过程这些对象来调用。

 

 

存储过程的语法:

create or replace PROCEDURE 过程名(参数名) AS/IS plsql子程序体

 

根据参数的类型,我们将其分为3类讲解:

 

不带参数的

 

带输入参数的

 

带输入输出参数的。

 

<1>无参存储:

创建存储:建议使用PROCEDURE这个窗口

create or replace procedure p_hello IS

begin 

  dbms_output.put( 'b' ); --写入buffer但不输出
 dbms_output.new_line; --回车(换行),输出                             
 dbms_output.put_line( 'hello world!' ); --输出并换行
 

end p_hello

测试存储:

 

调用方法:

如何调用执行,两种方法:

一种是是用exec命令来调用用来测试存储

exec过程名

一种是用其他的程序plsqljava)来调用

 

l 程序调用 

BEGIN

  sayhelloworld;

  sayhelloworld;

  sayhelloworld;

END;

 

带书输入参数IN

示例

查询并打印某个员工(如7839号员工)的姓名和薪水--存储过程:要求,调用的时候传入员工编号,自动控制台打印:

create or replace procedure p_queryempsal(i_empno IN emp.empno%TYPE)

IS

--声明变量

v_ename emp.empname%TYPE;

v_sal emp.empsal%TYPE;

select empname,empsal into v_ename,v_sal from emp where empno=i_empno;

dbms_output.put_line('姓名:'||v_ename||',薪水:'||v_sal);

end p_queryempsal;

--命令调用

exec p_queryempsal(7878);

--程序调用

declare

i_empno emp.empno%TYPE:=8989;

BEGIN

p_queryempsal(i_empno );

END;

 

 带输入参数IN和输出结果OUT-----主要是其他程序调用

 示例:

----输入员工号查询某个员工(7839号(老大)员工)信息,要求,将薪水作为返回值输出,给调用的程序使用。

CREATE OR REPLACE PROCEDURE p_queryempsal_out( i_empno IN emp.empno%TYPE,o_sal OUT emp.sal%TYPE)

AS

BEGIN

  --赋值:将薪水的值赋给输出的参数o_sal

  SELECT sal INTO o_sal FROM emp WHERE empno=i_empno;  

END;

 

调用:

DECLARE

  --输入参数值

  v_empno emp.empno%TYPE:=7839;

  --声明一个变量来接收输出参数

  v_sal emp.sal%TYPE;

BEGIN

  p_queryempsal_out(v_empno,v_sal);--第二个参数是输出的参数,必须有变量来接收!!

  --当上面的语句执行之后,v_sal就有值了。

  dbms_output.put_line('员工编号为:'||v_empno||'的薪资为:'||v_sal);

END;

 

java程序如何调用存储过程:

//获取连接

Connection conn = JDBCUtils.getConnection();

String sql="{call p_queryempsal_out(?,?)}";//转义sql

CallableStatement call = conn.prepareCall(sql);

//1.输入参数

call.setInt(1, 7839);//索引位置

 

call.registerOutParameter(2, OracleTypes.DOUBLE);//第一个参数是占位符,第二个参数数据类型

 

 

//执行存储

 

call.execute();//执行的时候,会自动将参数传入数据库,将输出参数返回的数据,封装会call对象中。

 

//获取输出参数的值

 

double sal = call.getDouble(2);

 

System.out.println("薪资是:"+sal);

 

//释放资源

 

JDBCUtils.release(conn, call, null);

 结果如下:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM