oracle 使用java调用存储过程和存储函数

(本文章内容仅在windows10下经测试能够运行,不能保证其他环境下的可靠性)

 

目录

1)调用存储过程

2)调用存储函数

 

调用存储过程

原理:使用preparedStatement接口的子接口CallableStatement接口获取执行sql语句的对象,依据jdk文档给定的sql语句格式调用存储过程,

具体格式如下:

{call <procedure-name>[(<arg1>,<arg2>, ...)]}

 

预编译的存储过程代码如下:

create or replace procedure p_yearsal(eno emp.empno%type,yearsal out number)
as
sal number(10);
comm number(10);
begin
  select sal,nvl(comm, 0) into sal,comm from emp where empno = eno;
  yearsal := sal * 12 + comm;
end;

调用该存储过程的java代码所需的sql语句如下:

 

String sql = "{call p_yearsal(?,?)}";

然后需要对sql语句的存储过程参数的占位符赋值,

输入型参数使用setObject(int parameterIndex,Object o)方法赋值;输出型参数使用registerOutParamter(int parametrIndex,int type)方法注册,第二参数是OracleTypes对象所定义的常量。

使用getObject(int parameterInex)方法获取输出型参数的值

示例java代码如下:

/**
     * 使用java调用存储过程,
     * {call <procedure-name>[(<arg1>,<arg2>, ...)]} 调用存储过程的格式
     */
    @Test
    public void testProcedure() throws SQLException {
        //获得连接
        connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "o_user1", "p123456");
        //准备sql语句
        String sql = "{call p_yearsal(?,?)}";
        //获取执行sql语句的对象
        CallableStatement pstm = connection.prepareCall(sql);
        //设置输入型参数使用setObject(parameterIndex,o)方法,也可具体更加类型调用其他set方法
         pstm.setInt(1, 7788);
        //设置输出型参数使用registerOutParameter(parameterIndex,int)方法
        pstm.registerOutParameter(2, OracleTypes.NUMBER);
        //执行sql语句
        pstm.execute();
        System.out.println(pstm.getObject(2));
        //释放资源
        pstm.close();
    }

上面代码加载驱动和释放资源部分代码已使用@Before和@After注解所使用的方法完成。

 

调用存储函数

原理:使用preparedStatement接口的子接口CallableStatement接口获取执行sql语句的对象,依据jdk文档给定的sql语句格式调用存储函数,

具体格式如下:

{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}

 

预编译的存储函数代码如下:

create or replace function f_yearsal(eno emp.empno%type) return number
is
s number(10);
begin
  select sal * 12 + nvl(comm,0) into s from emp where empno = eno;
  return s;
end;

 

调用该存储函数的java代码所需的sql语句如下:

String sql = "{? = call f_yearsal(?)}";

然后需要对sql语句的存储函数参数和返回值的占位符赋值,

输入型参数使用setObject(int parameterIndex,Object o)方法赋值;输出型参数和返回值使用registerOutParamter(int parametrIndex,int type)方法注册,第二参数是OracleTypes对象所定义的常量。

使用getObject(int parameterInex)方法获取输出型参数和存储函数返回值的值

示例java代码如下:

/**
     * java调用存储函数
     * {?= call <procedure-name>[(<arg1>,<arg2>, ...)]} 调用存储函数的格式
     */
    @Test
    public void testFunction() throws SQLException {
        //获得连接
        connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "o_user1", "p123456");
        //准备sql语句
        String sql = "{? = call f_yearsal(?)}";
        //获取执行sql语句的对象
        CallableStatement pstm = connection.prepareCall(sql);
        //设置输入型参数使用setObject(parameterIndex,o)方法,也可具体更加类型调用其他set方法
        pstm.setInt(2, 7788);
        //设置输出型参数使用registerOutParameter(parameterIndex,int)方法
        pstm.registerOutParameter(1, OracleTypes.NUMBER);
        //执行sql语句
        pstm.execute();
        System.out.println(pstm.getObject(1));
        //释放资源
        pstm.close();
    }

上面代码加载驱动和释放资源部分代码已使用@Before和@After注解所使用的方法完成。

 

posted @ 2020-06-07 15:16  DNoSay  阅读(416)  评论(0编辑  收藏  举报