新手编写存储过程入门

存储过程的 概念:

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

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

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


存储作用:

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


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

提示:

l plsql是存储过程的基础。

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



存储过程的语法:

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


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


l不带参数的


l带输入参数的


l带输入输出参数的。


<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

测试存储:


调用方法:

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

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

exec过程名

l一种是用其他的程序(plsql和java)来调用


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对象中。


//获取输出参数的值


doublesal = call.getDouble(2);


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


//释放资源


JDBCUtils.release(conn, call, null);

 结果如下:

你可能感兴趣的:(新手编写存储过程入门)