java调用oracle存储过程-多实例

弄了半天,网上找了很久,都自己总结的。这里的表用 scott 用户登录 里面都有。给像我这样正在摸索的新手们:


 实例 1 :无返回结果,无须传入参数的

第一步:创建存储过程

create or replace procedure p_002 is

begin

  dbms_output.put_line( ' 开始 ' );

  update emp  e set sal= 810 where e.empno = 7369 ;

  dbms_output.put_line( ' 结束 ' );

end p_002;

第二步: Java 代码

      @Test

      public void testP_002() throws SQLException {

            CallableStatement proc = null ;

            proc = ConnUtil.getConnection ().prepareCall( "{ call p_002}" );

            proc.execute();

      }

 实例 2 :需要传入参数,无返回结果:(可跳过,直接看实例 3

 实例 3 :需要传入参数,返回单个结果

      第一步:创建存储过程:

      create or replace procedure p_001(

pram in number ,-- 输入的员工 ID

out1 out varchar2 ,-- 输出的姓名

out2 out varchar2 – 输出的薪水

) is

    r emp % rowtype ; -- 得到某列

  BEGIN

    dbms_output.put_line( ' 编号 姓名 薪水 ' );

    select * into r from emp where empno = pram;

    dbms_output.put_line(r.ename || ' ' || r.sal); -- 输出结果 , 需要 set serverout on 才能显示 .

    out1 := r.ename; -- 赋值

    out2 := r.sal; -- 赋值 

  END ;

      第二步: Java 代码:

      @Test

      public void testProcedure() throws Exception {

            CallableStatement proc = null ;

            proc = ConnUtil.getConnection ().prepareCall( "{ call p_001(?,?,?) }" );

            proc.setInt(1, 7499);

            proc.registerOutParameter(2, java.sql.Types. CHAR );

            proc.registerOutParameter(3, java.sql.Types. CHAR );

            proc.execute();

            System. out .println(proc.getString(2) + "    " + proc.getString(3));

      }

实例 4: 输入一个参数,得到多个结果集:

      第一步:定义一个游标:(这里一定要有包名)

            create or replace package out_param is

type out_cur is ref cursor ;

end out_param;

      第二步:定义存储过程:

  create or replace procedure p_003(i_job in varchar2 ,

                                    p_rc  out PKG_TEST.myrctype) as

  BEGIN

    OPEN p_rc FOR

      select from emp where job = i_job;

  END ;

   

      第三步: Java 代码:

      @Test

      public void testP_003() {

            try {                 

                  Connection conn = ConnUtil.getConnection ();                 

                  CallableStatement stmt = conn.prepareCall( "{ call P_003(?, ?) }" );

                 

                  stmt.setString(1, "SALESMAN" );

                  stmt.registerOutParameter(2, -10 /* OracleTypes.CURSOR = -10 */ ); // REF

                                                                                                                        // CURSOR(OracleTypes.CURSOR==-10)

                 

                  stmt.execute();

                 

                  ResultSet rs = (ResultSet) stmt.getObject(2);

                  System. out .println( "----" + rs.toString() + "----" );

                  while (rs.next()) {

                        System. out .println(rs.getString( "ename" )+ rs.getString( "job" ));

                  }

                  rs.close();

                  rs = null ;

                  stmt.close();

                  stmt = null ;

                  conn.close();

                  conn = null ;

            } catch (SQLException e) {

                  System. out .println(e.getLocalizedMessage());

            }

      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值