2017-06-06 77 views
0

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

这里是我的详细信息:

我想调用下面的程序:

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) 
    ); 
+0

我不这么认为。不知道你将如何映射到该oracle类型?你如何在普通的java代码中做到这一点?也许有些东西可以添加到骆驼钩入自定义类型 –

+0

可以使用java.sql.Struct(https://docs.oracle.com/cd/B28359_01/java.111/b31224/oraoot.htm) 数据类型名字是STRUCT –

回答

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)); 

再回到骆驼SQL存储过程组件 - 该组件是在类声明的程序参数

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,命名的数组类型。

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

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

相关问题