JDBC调用存储函数(PL/SQL)

1.简介


本文使用JDBC调用 java,sql.CallableStatement来实现



2.CallableStatement介绍


	public interface CallableStatement  extends PreparedStatement
	(引用API)作用:用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程SQL转义语法,该语法允许对所有 RDBMS 使用标准方式调用存储过程。
	 此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式,如果使用结果参数,则必须将其注册为 OUT 参数。其他参数可用于输入、输出或同时用于二者。
	参数是根据编号按顺序引用的,第一个参数的编号是 1
	
	{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
   	{call <procedure-name>[(<arg1>,<arg2>, ...)]}
3.上代码前介绍:
		3.1.环境:
			数据库Oracle
3.上代码:
存储函数的代码:
create or replace function add_(v_add1 number,v_add2 number)
return number
is
       v_sum number(3);
begin
       v_sum := v_add1 +v_add2;
       return v_sum;
end;
Java代码:
package cn.jdbc;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;

import org.junit.Test;

import cn.jdbc_tools.JDBCTools;

/**
 * CallableStatementDemo基本使用演示
 * @author _jon
 *
 */
public class CallableStatementDemo {
		@Test
		public void fun(){
			//求两个数之和的存储函数add_
			callableStatementfun();
		}

		private void callableStatementfun() {
			//加载驱动
			//1.得到连接
			Connection conn =null;
			CallableStatement callableStatement = null;
			
			try{
				conn = JDBCTools.getOracleConnection();
				String sql="{?=call add_(?,?)}";//带返回值的是存储函数,没有的是存储过程
				//2.得到callableStatement
				callableStatement = conn.prepareCall(sql);
				//3.注册OUT参数
				callableStatement.registerOutParameter(1, Types.NUMERIC);
//				callableStatement.registerOutParameter(2, Types.NUMERIC);
//				callableStatement.registerOutParameter(3, Types.NUMERIC);
				//4.传入的参数:
				callableStatement.setInt(2, 2);
				callableStatement.setInt(3, 7);
				//4.执行
				callableStatement.execute();
				//5.得到返回值
				int sum = callableStatement.getInt(1);
				System.out.println(sum);
			}catch(SQLException e){
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				JDBCTools.close(null,callableStatement,conn);
			}
		}
}
关于out参数:如果有返回值,那么返回值是out类型,所以要注册callableStatement.registerOutParameter(...);如果是普通参数类型直接调用callableStatement.setInt(...);传参数就可以

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们在Java调用存储过程并尝试获取一个PL/SQL TABLE类型(也称为类型为TABLE的Oracle数据库对象)的输出参数时,可能会遇到类型错误的问题。这是因为Java与Oracle的类型定义方式不同,需要进行一些额外的处理。 解决方法如下: 1.使用Oracle的JDBC驱动程序,以便能够使用Oracle的特殊数据类型。 2.将Java中的Array类型转换为Oracle中的ARRAY类型,然后将其传递给存储过程。 3.在存储过程中,将ARRAY类型转换为TABLE类型,然后再将其返回给Java。 下面是一段示例代码,演示了如何在Java调用存储过程并获取一个PL/SQL TABLE类型的输出参数: ```java Connection conn = DriverManager.getConnection(url, username, password); CallableStatement cstmt = conn.prepareCall("{call stored_proc(?)}"); // 定义一个Java数组 String[] array = {"value1", "value2", "value3"}; // 将Java数组转换为Oracle数组 ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("MY_ARRAY_TYPE", conn); ARRAY oracleArray = new ARRAY(descriptor, conn, array); // 将Oracle数组设置为CallableStatement对象的参数 cstmt.setArray(1, oracleArray); // 执行CallableStatement对象,调用存储过程 cstmt.execute(); // 获取CallableStatement对象的输出参数 ARRAY outputArray = (ARRAY) cstmt.getObject(2); // 将Oracle数组转换为Java数组 String[] output = (String[]) outputArray.getArray(); // 处理Java数组 ... ``` 在以上示例中,我们首先使用Oracle的JDBC驱动程序,然后将Java中的Array类型转换为Oracle中的ARRAY类型。接着,我们将Oracle数组设置为CallableStatement对象的参数,并执行CallableStatement对象,调用存储过程。最后,我们将Oracle数组转换为Java数组,并进行必要的处理。 需要注意的是,在这个示例中,我们假设存储过程的输出参数是MY_ARRAY_TYPE类型的一个TABLE对象。如果存储过程的输出参数类型不同,需要根据实际情况进行整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值