【问题标题】:jooq oracle stored procedures with ARRAY, Invalid column type: 1111带有 ARRAY 的 jooq oracle 存储过程,列类型无效:1111
【发布时间】:2015-12-10 06:21:52
【问题描述】:

我正在尝试使用 JOOQ 在 Oracle 中调用存储过程。存储过程的一些 in 和 out 参数是自定义类型。

其中之一的定义是:

CREATE OR REPLACE TYPE "TAB_VARCHAR2_500" is table of varchar2(500);

我正在以这种方式创建 oracle.sql.ARRAY 类型:

ArrayDescriptor ard=ArrayDescriptor("TAB_VARCHAR2_500",connection);

//this is my object of the stores procedure, generated by jooq

aimws.setPDataDesc(new oracle.sql.ARRAY(ard,connection,lineData.toArray()));

aimws.execute(jooq.configuration());

但是当我执行时,我得到了这个(即使我将值设置为 null):

SQL state [99999]; error code [17004]; Invalid column type: 1111; nested exception is java.sql.SQLException: Invalid column type: 1111

在 JOOQ 为该存储过程生成的 java 类中,类型是

public static final Parameter<Object> P_DATA_DESC = createParameter("P_DATA_DESC", org.jooq.impl.DefaultDataType.getDefaultDataType("TABLE"), false);

我正在使用 Spring 将应用程序部署为 jboss 中的 EAR 项目

我做错了什么?我必须在 java 中创建什么样的对象?

【问题讨论】:

  • 应该有一个为TAB_VARCHAR2_500 生成的类。您不需要与 ojdbc API 搏斗,例如 ArrayDescriptorARRAY。您是否(不小心)从源代码生成中排除了该类?这可以通过&lt;exclude/&gt; 发生,或者如果表类型与表在不同的架构中,并且您没有同时包含这两个架构。
  • 嗨卢卡斯,感谢您的及时回答。我使用 只生成我将要使用的内容。现在我有了一个包含该 UDT 定义的记录类。
  • 嗨卢卡斯,感谢您的及时回答。我使用 仅为我将要使用的内容生成类。现在我为整个模式生成 java 类,我看到了该特定类型的“记录”类,但没有看到“表”类。不确定我必须发送什么 java 对象。我在 ArrayList. 中有数据

标签: java oracle stored-procedures jooq


【解决方案1】:

您可能在代码生成期间没有包含TAB_VARCHAR2_500 类型,这就是生成器输出中缺少它的原因。一旦让生成器生成这种类型,就可以将其用作数组的包装器。通常:

aimws.setPDataDesc(new TabVarchar2_500Record(lineData));
aimws.execute(jooq.configuration());

【讨论】:

  • 我是这样用的,但还是同样的错误“无效的列类型:1111”。我将跟踪级别设置为调试,并且在调用例程时可以看到绑定值,现在它们应该是 ()。我怎样才能获得更多关于我可能做错了什么的信息?
  • 解决了!!这是你第一次指出的。我混合配置文件。如何仅使用标签 . 包含 UDT
  • 你必须包含TAB_VARCHAR2_500
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 2018-06-13
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多