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