在Apache Camel SQL-STORED组件中使用Oracle用户定义的对象类型

时间:2017-06-06 15:57:01

标签: oracle stored-procedures apache-camel

有没有人在通过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)
    );

2 个答案:

答案 0 :(得分:0)

经过一番挖掘,答案是"否"。但是,扩展应该相当简单。使用自定义数据类型时,每个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

以下是处理过程参数声明的代码片段:

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以支持所有选项。

答案 1 :(得分:0)

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