创建存储过程:
语法:create [or replace] PROCEDURE 过程名(参数列表)
AS
PLSQL子程序体;
调用 存储过程的方式 两种
1、execute(exec) ------exec 函数名()
2、begin
函数名()
end -------begin 函数名()end
函数(Function)为一命名的存储程序,可带参数,并返回一计算值。函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值。函数说明要指定函数名、结果值的类型,以及参数类型等。
建立存储函数的语法:
CREATE [OR REPLACE] FUNCTION 函数名(参数列表)
RETURN 函数值类型
AS
PLSQL子程序体;
一般来讲,过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。
但过程和函数都可以通过out指定一个或多个输出参数。
我们可以利用out参数,在过程和函数中实现返回多个值。
如果只有一个返回值,用存储函数;否则,就用存储过程。
一般不在存储过程和存储函数中做提交和回滚操作
如果一个存储过程中含有很多个返回值,需要在存储过程中全部写出来,比较的不方便,所以可以让存储过程中返回一个指针进行处理,即包
1 --存储过程 2 create or replace procedure getEmpInfo(eno in testemp.empno%type,--输入值in可以省略 3 empname out varchar,--输出值out必须要,只需要写返回类型,不需要写精度 4 empjob out varchar, 5 empsal out number 6 ) 7 as 8 begin 9 select ename,job,sal into empname,empjob,empsal from testemp where empno=eno; 10 end; 11 12 --函数 13 14 create or replace function getSals(eno in testemp.empno%type) 15 return testemp.sal%type --定义返回类型 16 as 17 psal testemp.sal%type; 18 pcomm testemp.comm%type; 19 begin 20 select sal,comm into psal,pcomm from testemp where empno=eno; 21 return (psal*12+nvl(pcomm,0)); --返回值 22 end; 23 24 25 --创建包 26 create or replace package mypackage as--mypackage 自定义包名 27 type empcursor is ref cursor;--声明一个自定义光标类型 28 procedure queryemp(dtno in testemp.deptno%type, 29 empinfo out empcursor );--存储过程 30 end mypackage;--结束包头定义 31 32 create or replace --创建包体 33 package body mypackage as 34 procedure queryemp(dtno in testemp.deptno%type,empinfo out empcursor) as 35 begin 36 open empinfo for select * from testemp where deptno=dtno;--将查询到的数据放到光标中 37 end queryemp; 38 end mypackage;
在java中调用存储过程,函数
1、导包
在oracle安装目录product10.2.0db_1jdbclib目录下。默认在C:oracleproduct10.2.0db_1jdbclib
2、
java连接oracle驱动 private static String driver="oracle.jdbc.OracleDriver"; private static String url="jdbc:oracle:thin:@192.168.250.144:1521:orcl"; private static String user="scott"; private static String password="tiger";
3、
1 调用存储过程 2 String sql="{call getEmpInfo(?,?,?,?)}";//调用存储过程sql语句 3 Connection conn=null; 4 CallableStatement callStatement=null; 5 try { 6 conn=OracleUtils.getConnection(); 7 callStatement=conn.prepareCall(sql); 8 callStatement.setInt(1, 7839);//设置输入值 9 callStatement.registerOutParameter(2,OracleTypes.VARCHAR);//设置输出值 10 callStatement.registerOutParameter(3,OracleTypes.VARCHAR); 11 callStatement.registerOutParameter(4,OracleTypes.NUMBER); 12 13 callStatement.execute();//执行存储过程 14 15 String name=callStatement.getString(2);//获取输出值 16 String job=callStatement.getString(3); 17 double sal=callStatement.getDouble(4); 18 19 System.err.println("name="+name); 20 System.err.println("job="+job); 21 System.err.println("sal="+sal); 22 23 } catch (Exception e) { 24 e.printStackTrace(); 25 }finally{ 26 OracleUtils.release(conn, callStatement, null); 27 }
1 调用函数 2 String sql="{?= call getSals(?)}"; 3 Connection conn=null; 4 CallableStatement call=null; 5 try { 6 conn=OracleUtils.getConnection(); 7 call=conn.prepareCall(sql); 8 call.registerOutParameter(1, OracleTypes.NUMBER); 9 call.setInt(2, 7839); 10 11 call.execute(); 12 13 double allsal=call.getDouble(1); 14 15 System.err.println(allsal); 16 17 } catch (Exception e) { 18 e.printStackTrace(); 19 }finally{ 20 OracleUtils.release(conn, call, null); 21 }
1 调用带有光标返回值得包 2 String sql="{call mypackage.queryemp(?,?)}"; 3 Connection conn=null; 4 CallableStatement call=null; 5 ResultSet rs=null; 6 try { 7 conn=OracleUtils.getConnection(); 8 call=conn.prepareCall(sql); 9 call.setInt(1, 30); 10 call.registerOutParameter(2, OracleTypes.CURSOR); 11 12 call.execute(); 13 14 rs=((OracleCallableStatement)call).getCursor(2);//获取光标值的结果集 15 while(rs.next())//循环光标 16 { 17 String name=rs.getString("ename"); 18 String job=rs.getString("job"); 19 System.err.println("name:"+name+" job:"+job); 20 21 } 22 23 } catch (Exception e) { 24 e.printStackTrace(); 25 }