如何在WSO2 Micro Integrator中调用含多入参出参的存储过程
在WSO2 Micro Integrator中调用带IN/OUT参数的存储过程
前提准备
- 配置数据库数据源
在WSO2 Micro Integrator的deployment.toml中添加Oracle数据源配置(适配示例中的Oracle存储过程):
[database.datasource.MyOracleDS] url = "jdbc:oracle:thin:@//localhost:1521/ORCL" username = "你的数据库用户名" password = "你的数据库密码" driver_class_name = "oracle.jdbc.OracleDriver"
将Oracle驱动包(如ojdbc8.jar)放入MI的repository/components/lib目录,重启MI生效。
- 确保Integration Studio已关联该MI环境,可在数据源视图中测试连接是否正常。
调用单IN单OUT参数的存储过程
以你提供的SAY_HELLO存储过程为例,使用dblookup mediator实现调用并获取OUT参数:
ESB序列配置
<sequence name="CallSayHelloProcSeq" xmlns="http://ws.apache.org/ns/synapse"> <!-- 定义IN参数值,可从请求上下文或直接赋值 --> <property name="FULLNAME" value="Jean-Paul Abi-Ghosn" scope="default" type="STRING"/> <!-- 调用存储过程并提取OUT参数 --> <dblookup> <connection> <pool> <dsName>MyOracleDS</dsName> </pool> </connection> <statement> <!-- 使用CALL语法调用存储过程,?为参数占位符 --> <sql><![CDATA[CALL SAY_HELLO(?, ?)]]></sql> <!-- 绑定IN参数,类型与存储过程匹配 --> <parameter type="VARCHAR" value="$ctx:FULLNAME"/> <!-- 声明OUT参数,指定方向和参数名 --> <parameter type="VARCHAR" direction="OUT" name="RESPONSE"/> </statement> <!-- 将OUT参数值存入指定属性 --> <result name="helloResponse" column="RESPONSE"/> </dblookup> <!-- 日志输出验证结果 --> <log level="custom"> <property name="存储过程返回结果" expression="$ctx:helloResponse"/> </log> </sequence>
调用多OUT参数的存储过程
如果存储过程包含多个OUT参数,只需扩展parameter和result标签即可。示例如下:
示例存储过程
CREATE OR REPLACE PROCEDURE GET_USER_DETAILS(USER_ID IN NUMBER, USER_NAME OUT VARCHAR2, USER_EMAIL OUT VARCHAR2) AS BEGIN SELECT NAME, EMAIL INTO USER_NAME, USER_EMAIL FROM USERS WHERE ID = USER_ID; END;
对应的ESB序列配置
<sequence name="CallUserDetailsProcSeq" xmlns="http://ws.apache.org/ns/synapse"> <property name="USER_ID" value="1001" scope="default" type="INTEGER"/> <dblookup> <connection> <pool> <dsName>MyOracleDS</dsName> </pool> </connection> <statement> <sql><![CDATA[CALL GET_USER_DETAILS(?, ?, ?)]]></sql> <parameter type="INTEGER" value="$ctx:USER_ID"/> <parameter type="VARCHAR" direction="OUT" name="USER_NAME"/> <parameter type="VARCHAR" direction="OUT" name="USER_EMAIL"/> </statement> <result name="userName" column="USER_NAME"/> <result name="userEmail" column="USER_EMAIL"/> </dblookup> <log level="custom"> <property name="用户名" expression="$ctx:userName"/> <property name="邮箱" expression="$ctx:userEmail"/> </log> </sequence>
关键说明
- 选择mediator:优先使用
dblookupmediator获取OUT参数,dbreport主要用于执行无返回值的数据库写操作,不支持提取输出参数。 - 参数匹配:
parameter标签的type需与存储过程参数类型严格对应(如Oracle的VARCHAR2对应VARCHAR,NUMBER对应INTEGER)。 - 属性存储:每个OUT参数通过
result标签存入独立的Synapse属性,后续可在序列中直接引用。
内容的提问来源于stack exchange,提问作者Jean-Paul Abi-Ghosn
相关产品推荐
相关产品推荐

