2015-06-02 25 views
1

我有一个NULL值传递给一个JDBC存储函数(使用可调用语句)的麻烦。这只是一个问题,如果我试图将IN参数设置为NULL(例如,我可以创建并传递一个空数组,但我不应该这样做)。如何通过一个期望的阵列型的NULL(或空)阵列到JDBC的CallableStatement(即期望的阵列)

例如,我可以做到这一点作为一个变通:

callableStatement.setObject(index, callableStatement.getConnection.createArrayOf("numeric", Array().asInstanceOf[Array[AnyRef]])) 

但是,这困扰着我。首先,应该有一个用于传递NULL数组的API。其次重要的是,我创建一个空数组没有很好的理由(我不得不创建正确的数组类型所以这不是一个班轮,我需要支持几种不同的类型)。它变得混乱。

我应该能够做到这一点,我认为(或者至少东西非常相似):

callableStatement.setNull(index, Types.ARRAY) 

但它导致异常:

com.edb.util.PSQLException: ERROR: function app_fetch_user_list_pkg.n_execute(character varying, character varying[], character varying, boolean, integer) does not exist

任何想法? (我们正在使用Postgresql/EDB以及Oracle ......到目前为止,我一直在试验Postgresql实例)。

+0

您是否尝试使用的'setObject'方法,它允许用户指定目标类型一个(即['的setObject(INT parameterIndex,对象x,INT的targetSqlType)'](http://docs.oracle.com/ JavaSE的/ 8 /文档/ API/JAVA/SQL/PreparedStatement.html#的setObject-INT-java.lang.Object中-内部 - )或['的setObject(INT parameterIndex,对象x,SQLTYPE的targetSqlType)'](HTTP:// docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setObject-int-java.lang.Object-java.sql.SQLType-) –

+0

是......没有多少运气。我还试过'的setBinaryStream()',并得到了回报异常消息:“此功能尚未实现”我真的不喜欢这个驱动 – Zac

回答

2

嗯,我使用PreparedStatement.setNull(position, Types.ARRAY)与9.4-1202-jdbc41 JDBC驱动程序和按预期工作。

+1

我怀疑你没有使用教育局 - 似乎我们很多问题都来自教育局。我们确实设法让它工作(有点),但最终转移到甲骨文,虽然这导致了一些不安,但一切正常运作。所以......这个限制似乎是在教育局的司机。 – Zac

+0

@Zac是的,我使用的是香草Postgres。 EDB有趣的评论。 –

2

试试这个:

callableStatement.setString(index, "{}"); 
+0

嗯,是的,这就是我的工作,围绕'createArrayOf会发生什么()'但是,正如我指出的那样,这不是我应该做的事情。数据库实际上不喜欢它,抛出一个关于h aving传入一个空数组(这只是我们的API)。最好的解决方案是找出为什么我不能使用'setNull()'调用 - 我开始认为这可能是我们的Postgresql/EDB驱动程序的限制。 – Zac