Java通过connection对象调用存储过程

Java调用存储过程

java代码调用存储过程,需要获取到connection对象,然后执行prepareCall()方法,样例如下:

package com.leo.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.NamingException;

import oracle.sql.ARRAY;
import oracle.sql.STRUCT;

import org.junit.Test;

public class ProcedureTest {
    private static String driver = "oracle.jdbc.driver.OracleDriver";
    private static String strUrl = "jdbc:oracle:thin:@192.168.1.192:1521:ORCL";
    private static ResultSet rs = null;
    private static Connection conn = null;
    private static CallableStatement proc = null;

    private void testBefore() throws ClassNotFoundException, SQLException, NamingException {
        Class.forName(driver);
//        Context ic = new InitialContext();
//        DataSource source = (DataSource)ic.lookup("jdbc/leo-cm");          
//        conn = source.getConnection();  
        conn = DriverManager.getConnection(strUrl, "username", "password");
    }

    private void testAfter() throws SQLException {
        conn.close();
    }

    @Test
    public void CUST_INFO() {
        try {
            testBefore();
            proc = conn.prepareCall("{ call MOBIOA_CUST_INFO(?,?) }");
            proc.setString(1, "8ba9184e-c92e-272c-2d8a-52258d404fa3");
            proc.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
            proc.execute();
            rs = (ResultSet) proc.getObject(2);
            while (rs.next()) {
                System.out.println("<tr><td>" + rs.getString(1) + "</td><td>" + rs.getString(2) + "</td></tr>");
            }
            testAfter();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Test
    public void BRANCH_INFO() {
        try {
            testBefore();
            proc = conn.prepareCall("{ call MOBIOA_BRANCH_INFO(?,?) }");
            proc.setString(1, "9801883");
            proc.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
            proc.execute();
            rs = (ResultSet) proc.getObject(2);
            while (rs.next()) {
                System.out.println("<tr><td>" + rs.getString(1) + "</td><td>" + rs.getString(2) + "</td></tr>");
            }
            testAfter();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Test
    public void LOGISTICS_LIST() {
        try {
            testBefore();

            proc = conn.prepareCall("{ call MOBIOA_LOGISTICS_LIST(?,?) }");
            proc.setString(1, "8ba9184e-c92e-272c-2d8a-52258d404fa3");
            //oracle中存储过程返回结果集时,需要注册该值为游标类型。
            proc.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
            proc.execute();
            rs = (ResultSet) proc.getObject(2);
            while (rs.next()) {
                System.out.println("<tr><td>" + rs.getString("day_send_c") + "</td><td>" + rs.getString(2)
                        + "</td></tr>");
            }
            testAfter();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    @Test
    public void CUST_LIST() {
        try {
            testBefore();
            proc = conn.prepareCall("{ call LEO.MOBIOA_CUST_LIST(?,?) }");
            proc.setString(1, "9000001");
            proc.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
            proc.execute();
            rs = (ResultSet) proc.getObject(2);
            while (rs.next()) {
                System.out.println("<tr><td>" + rs.getString(1) + "</td><td>" + rs.getString(2)
                        + "</td></tr>");
            }

            testAfter();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void AREA_MOUNTH_COUNT() {
        try {
            testBefore();
            proc = conn.prepareCall("{ call MOBIOA_AREA_MOUNTH_COUNT(?,?,?) }");
            proc.setString(1, "2a407b05-1580-35d8-e488-5215aa8eb706");
            proc.setString(2, "2007");
            proc.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
            proc.execute();
            rs = (ResultSet) proc.getObject(3);
            while (rs.next()) {
                System.out.println("<tr><td>" + rs.getString(1) + "</td><td>" + rs.getString(2)
                        + "</td></tr>");
            }

            testAfter();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void Cust_Progress() {
        ARRAY arr = null;
        try {
            testBefore();
            // org limit sorgseq 
            proc = conn.prepareCall("{ call MOBIOA_CUST_PROGRESS(?,?,?,?) }");
            proc.setString(1, "9000001");
            proc.setString(1, "1");
            proc.setString(1, "9000001");

            proc.registerOutParameter(4, java.sql.Types.ARRAY, "MOBIOA_CUST_ARRAY");
            proc.execute();
            arr = (ARRAY) proc.getArray(4);

            Object[] strcs = (Object[]) arr.getArray();
           for(Object strc:strcs){
               Object[] objs=((STRUCT)strc).getAttributes();
               System.out.println(objs[0]+" "+objs[1]+" "+objs[2]+" "+objs[3]);
           }

            testAfter();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testPorccc() throws Exception {
        testBefore();
        //该test_out_pro存储过程(mysql)带一个返回参数code1,tyint类型,同时里面有2个select语句,代码中的resultset来获取两个结果集,每个结果集遍历之后用####号隔开的,如果mysql中直接执行带返回参数(OUT)的存储过程,需要在输入返回参数(out类型的变量名)时带上@符号,如@code1,这样才能在mysql中直接执行。
        proc = conn.prepareCall("{ call test_out_pro(?) }");
            proc.registerOutParameter(1, Types.TINYINT);
            boolean flag = proc.execute();
            int code = proc.getInt(1);
            System.out.println("code: " + code);
            code = proc.getInt("code1");
            System.out.println(code);
            ResultSet rs;
            while(flag) {
                rs = proc.getResultSet();
                while(rs.next()) {
                    System.out.println("rs.getObject(1)--- " + rs.getObject(1) + " rs.getObject(2)--- " + rs.getObject(2));
                }
                System.out.println("##########################################");
                flag = proc.getMoreResults();
            }
            testAfter();
    }

}




存储过程:
CREATE OR REPLACE 
PROCEDURE insert_test(table_name in VARCHAR2,
 value_name IN VARCHAR2, value_age in int, re_value out VARCHAR2)
AS
 excu_sql VARCHAR2(100);
 intege :=0;
BEGIN
   excu_sql := 'INSERT INTO "'|| table_name || '" VALUES (''' ||value_name||''', ' || value_age||')';
   re_value := excu_sql;
  EXECUTE IMMEDIATE excu_sql; 
end;

mysql中update某些字段为null时需要注意的地方:

如果把已定义为null的列更新为null,则该列被设置到与列类型对应的默认值,并且累加警告数,对于数字类型,默认值为0,对于字符串类型,默认值为空字符串(“”),对于日期和时间类型,默认值为”zero”值

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注意,以下使用数据库为sql2000,驱动jtds1.2.2 一、调用存储过程(无结果集返回) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); callableStatement.execute(); //获得sql的消息并输出,这个估计很多人都需要 SQLWarning sqlWarning = callableStatement.getWarnings(); while (sqlWarning != null) { System.out.println("sqlWarning.getErrorCode() = " + sqlWarning.getErrorCode()); System.out.println("sqlWarning.getSQLState() = " + sqlWarning.getSQLState()); System.out.println("sqlWarning.getMessage() = " + sqlWarning.getMessage()); sqlWarning = sqlWarning.getNextWarning(); } //close ConnectionHelper.closeConnection(callableStatement, connection); 二、调用存储过程,返回sql类型数据(非记录集) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); //重点是这句1 callableStatement.registerOutParameter(3, Types.INTEGER); callableStatement.execute(); //取返回结果,重点是这句2 //int rsCount = callableStatement.getInt(3); //close ConnectionHelper.closeConnection(callableStatement, connection); 三、重点来了,返回记录集,多记录集 注意,不需要注册返回结果参数,只需要在sql中select出结果即可 例如:select * from tableName 即可得到返回结果 Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?) }"); //此处参数与结果集返回没有关系 callableStatement.setString(1, "xxxxxxxx"); callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); //以上两个语句,可以使用ResultSet resultSet = callableStatement.executeQuery();替代 //多结果返回 ResultSet resultSet2; if (callableStatement.getMoreResults()) { resultSet2 = callableStatement.getResultSet(); while (resultSet2.next()) { } } //close ConnectionHelper.closeConnection(callableStatement, connection); 提示:多结果返回可以使用如下代码(以上主要让
Java Spring Boot中调用Oracle存储过程,可以通过以下步骤实现: 1. 在数据库中创建存储过程: 在Oracle数据库中使用SQL语句创建所需的存储过程。例如: ``` CREATE OR REPLACE PROCEDURE procedure_name (parameter1 IN datatype1, parameter2 OUT datatype2) IS BEGIN -- 存储过程代码 END; ``` 2. 在Spring Boot项目中配置数据源: 在`application.properties`或`application.yml`文件中配置数据库连接信息,包括URL、用户名和密码。 3. 创建一个Java类来调用存储过程: 创建一个Java类,使用Spring Boot的`JdbcTemplate`或`NamedParameterJdbcTemplate`来执行存储过程。例如: ```java @Autowired private JdbcTemplate jdbcTemplate; public void callProcedure(parameter1, parameter2) { String procedureCall = "{call procedure_name (?, ?)}"; jdbcTemplate.call(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection connection) throws SQLException { CallableStatement callableStatement = connection.prepareCall(procedureCall); callableStatement.setXXX(1, parameter1); callableStatement.setXXX(2, parameter2); return callableStatement; } }, Arrays.asList(new SqlParameter(SqlType.TYPE_NAME, parameter1.getClass())), Arrays.asList(new SqlOutParameter(SqlType.TYPE_NAME, parameter2.getClass()))); } ``` 4. 调用存储过程: 在需要调用存储过程的地方,实例化上述Java类并调用`callProcedure`方法即可。 这样,Java Spring Boot应用程序就能够成功调用Oracle存储过程。请根据实际需求进行相应的参数类型和参数设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值