【问题标题】:Using Oracle user-defined object types in Apache Camel SQL-STORED Component在 Apache Camel SQL-STORED 组件中使用 Oracle 用户定义的对象类型
【发布时间】:2017-06-06 15:57:00
【问题描述】:

在通过 Camel sql-stored 组件调用存储过程时,有没有人举例说明如何使用 Oracle 用户定义的对象类型? Camel 文档 (http://camel.apache.org/sql-stored-procedure.html) 仅提供了一个使用内置数据类型的示例。

这是我的详细信息:

我正在尝试调用以下过程:

PROCEDURE get_eco_record(
      p_instance_id IN NUMBER,
      p_inparm IN InParm_rec,
      p_error_cd OUT NUMBER,
      p_error_message OUT VARCHAR2 )

这是 InParm_rec 对象类型的定义:

CREATE OR REPLACE TYPE InParm_rec
AS
  object
  (    
    part_no   VARCHAR2(75 BYTE) ,
    part_type VARCHAR2(100 BYTE) ,
    eff_date DATE,
    sub_name VARCHAR2(100),
    rec_type VARCHAR2(1)
    );

【问题讨论】:

  • 我不这么认为。不确定如何映射到该 oracle 类型?你会如何用纯 Java 代码做到这一点?也许可以在骆驼中添加一些东西来挂钩自定义类型
  • 它可以与 java.sql.Struct (docs.oracle.com/cd/B28359_01/java.111/b31224/oraoot.htm) 一起使用吗?数据类型名称是 STRUCT
  • 欢迎使用 Camel 文档。通常我在谷歌搜索 apache 信息时使用 -site:apache.org

标签: oracle stored-procedures apache-camel


【解决方案1】:

我根据您的要求打开了一个拉取请求https://github.com/apache/camel/pull/1749

【讨论】:

  • 感谢您的改进。我已经测试过并且效果很好。
【解决方案2】:

经过一番挖掘,答案是“不”。但是,扩展应该相当简单。使用自定义数据类型时,每个 SqlParameter 的声明需要(至少)三个参数 - parameter_name、Oracle_type 和 custom_data_type_name。在我的例子中,属性的声明应该如下:

    declareParameter(new SqlParameter("p_instance_id", OracleTypes.INTEGER));
        declareParameter(new SqlParameter("p_inparm",OracleTypes.ARRAY, "InParm_rec"));
        declareParameter(new SqlOutParameter("p_error_cd", OracleTypes.INTEGER));
        declareParameter(new SqlOutParameter("p_error_message", OracleTypes.VARCHAR));

回到 Camel SQL 存储过程组件——该组件在 Class 中声明过程参数

org.apache.camel.component.sql.stored.TemplateStoredProcedure

这里是处理过程参数声明的代码sn-p:

for (Object parameter : template.getParameterList()) {
    if (parameter instanceof InputParameter) {
        InputParameter inputParameter = (InputParameter) parameter;
        declareParameter(new SqlParameter(inputParameter.getName(), inputParameter.getSqlType()));
        inputParameterList.add(inputParameter);

    } else if (parameter instanceof OutParameter) {
        OutParameter outParameter = (OutParameter) parameter;
        declareParameter(new SqlOutParameter(outParameter.getOutValueMapKey(), outParameter.getSqlType()));
        setFunction(false);
    }
}

代码目前只支持两个参数(parameter_name、Oracle_type)。必须扩展代码以添加第三个参数(custom_data_type_name)。附加参数必须应用于用户命名类型,例如:STRUCT、DISTINCT、JAVA_OBJECT、命名数组类型。

另一个可能需要的参数是“scale”,它适用于 NUMERIC 和 DECIMAL 数据类型。

最好的方法是检查 org.springframework.jdbc.core.SqlParameter 和 org.springframework.jdbc.core.SqlOutParameter 类并扩展 Camel Sql-Stored 以支持它们的所有选项。

【讨论】:

  • 现在有支持吗?是否有任何示例或更新
猜你喜欢
  • 2014-03-08
  • 2017-07-25
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2021-11-25
  • 2019-04-26
  • 2017-03-21
相关资源
最近更新 更多