138.7. 声明存储的步骤模板
模板使用类似于 Java 方法签名的语法进行声明。存储的步骤的名称,然后用括号括起的参数。一个例子解释了这一点:
<to uri="sql-stored:STOREDSAMPLE(INTEGER ${headers.num1},INTEGER ${headers.num2},INOUT INTEGER ${headers.num3} result1,OUT INTEGER result2)"/>
参数由类型声明,然后使用简单表达式映射到 Camel 消息。因此,在本示例中,前两个参数是 INTEGER 类型的 IN 值,映射到消息标头。第三个参数是 INOUT,这表示它接受 INTEGER,然后返回不同的 INTEGER 结果。最后的参数是 OUT 值,也是 INTEGER 类型。
在 SQL 术语中,存储的步骤可以声明为:
CREATE PROCEDURE STOREDSAMPLE(VALUE1 INTEGER, VALUE2 INTEGER, INOUT RESULT1 INTEGER, OUT RESULT2 INTEGER)
138.7.1. IN 参数 复制链接链接已复制到粘贴板!
IN 参数使用由空格分开的四个部分:参数名称、SQL 类型(扩展)、类型名称和值源。
参数名称是可选的,如果未提供会自动生成。它必须在引号(')之间提供。
SQL 类型是必需的,可以是整数(正或负),或引用某些类中的整数字段。如果 SQL 类型包含一个点,则组件会尝试解析该类并读取给定字段。例如,SQL 类型 com.Foo.INTEGER 从类 com.Foo 的 INTEGER 字段读取。如果类型不包含逗号,那么用于解析整数值的类将是 java.sql.Types。类型可以通过扩展(如 DECIMAL (10))改为 java.sql.Types.DECIMAL,扩展为 10。
类型 name 是可选的,必须在引号之间提供。
值源是必需的。值源从 Exchange 填充参数值。它可以是 Simple 表达式或标头位置,例如 :#<header name& gt;。例如,Simple expression ${header.val} 表示参数值将从标题 val 中读取。标头位置表达式 :#val 将有相同的效果。
<to uri="sql-stored:MYFUNC('param1' org.example.Types.INTEGER(10) ${header.srcValue})"/>
URI 表示存储的步骤将使用参数名称 param1 调用,它的 SQL 类型是从类 org.example.Types 的 INTEGER 的 INTEGER 以及 scale 的 INTEGER 读取的。参数的输入值是从标题 srcValue 传递的。
<to uri="sql-stored:MYFUNC('param1' 100 'mytypename' ${header.srcValue})"/>
URI 与之前在 上相同,但 SQL 类型为 100,类型为 mytypename。
实际调用将使用 org.springframework.jdbc.core.SqlParameter 来完成。
138.7.2. OUT 参数 复制链接链接已复制到粘贴板!
OUT 参数的工作方式类似于 IN 参数,并包含三个部分:SQL 类型(具有 scale)、类型名称和输出参数名称。
SQL 类型的工作方式与 IN 参数相同。
类型名称是可选的,它的工作方式与 IN 参数相同。
输出参数名称用于 OUT 参数名称,以及存储结果的标头名称。
<to uri="sql-stored:MYFUNC(OUT org.example.Types.DECIMAL(10) outheader1)"/>
URI 表示 OUT 参数的名称为 outheader1,结果将是标题为 outheader1。
<to uri="sql-stored:MYFUNC(OUT org.example.Types.NUMERIC(10) 'mytype' outheader1)"/>
这与前面的名称相同,但类型名称为 mytype。
实际调用将使用 org.springframework.jdbc.core.SqlOutParameter 来完成。
138.7.3. INOUT 参数 复制链接链接已复制到粘贴板!
INOUT 参数是上述所有参数的组合。它们从交换中收到值,以及存储消息头的结果。唯一的注意事项是,IN 参数的"名称"被跳过。相反,OUT 参数 的名称 定义了 SQL 参数名称和结果标头名称。
<to uri="sql-stored:MYFUNC(INOUT DECIMAL(10) ${headers.inheader} outheader)"/>
实际调用将使用 org.springframework.jdbc.core.SqlInOutParameter 来完成。
138.7.4. 查询超时 复制链接链接已复制到粘贴板!
您可以在用于查询处理的语句上配置查询超时(via template.queryTimeout),如下所示:
<to uri="sql-stored:MYFUNC(INOUT DECIMAL(10) ${headers.inheader} outheader)?template.queryTimeout=5000"/>
当在事务级别中指定的超时的事务中执行时,这会被剩余的事务超时覆盖。