首页 > 代码库 > oracle 存储过程,函数和包

oracle 存储过程,函数和包

创建存储过程:
语法: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 as17 psal testemp.sal%type;18 pcomm testemp.comm%type;19 begin20   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 as34 procedure queryemp(dtno in testemp.deptno%type,empinfo out empcursor) as35   begin36     open empinfo for select * from testemp where deptno=dtno;--将查询到的数据放到光标中37   end queryemp;38 end mypackage;

 

在java中调用存储过程,函数

1、导包

技术分享在oracle安装目录product10.2.0\db_1\jdbc\lib目录下。默认在C:\oracle\product\10.2.0\db_1\jdbc\lib

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         }

 

oracle 存储过程,函数和包