Oracle 12c Service Bus运行SQL报Missing IN或OUT参数错误咨询
报错原因排查
- 参数映射遗漏:Oracle Service Bus的JDBC调用要求所有SQL中出现的绑定变量都必须配置对应的入参映射,你当前SQL涉及三个绑定变量:
:tipo、:posicao以及你提到的:codigo,任意一个变量没有配置传值都会触发该报错。 - 变量匹配规则问题:OSB的JDBC绑定默认按位置顺序匹配参数,而非变量名匹配,如果OSB侧配置的参数传递顺序和SQL中变量出现的顺序不一致,会导致参数识别失败。
- SQL语法错误:你提供的SQL中WHERE子句存在括号配对错误,注释掉的变量判断行导致逻辑块括号缺失,SQL解析器无法正确识别绑定变量的位置,进而报错。
- 变量名不统一:你问题中提到的变量名是
:codigo,但SQL中实际使用的变量名是:posicao,如果OSB侧传参的变量名和SQL实际使用的变量名不一致,也会导致参数找不到。
解决方法
- 首先修正SQL语法,调整WHERE子句的括号配对,规范条件逻辑,修正后的SQL参考如下:
SELECT Resultado_Ensaio.Amos_Cd_Tipo_Local, Resultado_Ensaio.Amos_Cd_Loc_Amostg, Resultado_Ensaio.Prod_Cd_Id, Resultado_Ensaio.Amos_Dh_Amostra, Resultado_Ensaio.Reen_Md_Res_Num, Componente_Gas_Nat.Cpgn_Nm_Abreviado, Caract_Produto.Capr_Nm_Completo, Unidade_Medida_Emq.Unme_Sg_Notacao, Metodo_Ensaio.Prme_Cd_Id, Metodo_Ensaio.Meen_Cd_Id, Resultado_Ensaio.Reen_Cd_Res_Alfa_E, Resultado_Ensaio.Tiam_Cd_Id, Caract_Produto.Capr_Cd_Comp_Carac, Caract_Produto.Capr_Cd_Id , Ce.AMOS_NR_CERT_QUAL, Ce.AMOS_DT_CERT_QUAL FROM Caract_Produto INNER JOIN Resultado_Ensaio ON (Caract_Produto.Capr_Cd_Id = Resultado_Ensaio.Capr_Cd_Id AND Caract_Produto.Capr_Cd_Comp_Carac = Resultado_Ensaio.Capr_Cd_Comp_Carac AND Caract_Produto.Grcp_Cd_Id = Resultado_Ensaio.Grcp_Cd_Id) INNER JOIN Metodo_Ensaio ON (Metodo_Ensaio.Meen_Cd_Id = Resultado_Ensaio.Meen_Cd_Id AND Metodo_Ensaio.Prme_Cd_Id = Resultado_Ensaio.Prme_Cd_Id) INNER JOIN Unidade_Medida_Emq Unidade_Medida_Emq ON (Unidade_Medida_Emq.Gume_Cd_Id = Resultado_Ensaio.Gume_Cd_Id AND Unidade_Medida_Emq.Unme_Cd_Id = Resultado_Ensaio.Unme_Cd_Id) LEFT JOIN Caract_Produto_Componente ON (Caract_Produto_Componente.Grcp_Cd_Id = Resultado_Ensaio.Grcp_Cd_Id AND Caract_Produto_Componente.Capr_Cd_Id = Resultado_Ensaio.Capr_Cd_Id AND Caract_Produto_Componente.Capr_Cd_Comp_Carac = Resultado_Ensaio.Capr_Cd_Comp_Carac) LEFT JOIN Componente_Gas_Nat ON (Caract_Produto_Componente.Cpgn_Cd_Id = Componente_Gas_Nat.Cpgn_Cd_Id) LEFT JOIN Certificado_Ensaio Ce ON (Resultado_Ensaio.Amos_Cd_Loc_Amostg = Ce.AMOS_CD_LOC_AMOSTG AND Resultado_Ensaio.Amos_Cd_Tipo_Local = Ce.AMOS_CD_TIPO_LOCAL AND Resultado_Ensaio.Amos_Dh_Amostra = Ce.AMOS_DH_AMOSTRA AND Resultado_Ensaio.Tiam_Cd_Id = Ce.TIAM_CD_ID AND Resultado_Ensaio.Prod_Cd_Id = Ce.PROD_CD_ID AND Resultado_Ensaio.Prco_Cd_Comp_Prod = Ce.PRCO_CD_COMP_PROD AND Resultado_Ensaio.Orga_Cd_Cbi_Exec = Ce.ORGA_CD_CBI_EXEC) WHERE Resultado_Ensaio.Amos_Cd_Tipo_Local = (:tipo) AND ( (UPPER(:posicao) = 'U' AND Resultado_Ensaio.Amos_Dh_Amostra = ( SELECT MAX(Reen2.Amos_Dh_Amostra) FROM Resultado_Ensaio Reen2 WHERE Resultado_Ensaio.Amos_Cd_Loc_Amostg = Reen2.Amos_Cd_Loc_Amostg AND Resultado_Ensaio.Amos_Cd_Tipo_Local = Reen2.Amos_Cd_Tipo_Local AND Reen2.Amos_Dh_Amostra <= TO_TIMESTAMP('1999-11-01 07:00', 'YYYY-MM-DD HH24:MI:SS') ) ) OR (UPPER(:posicao) = 'P' AND Resultado_Ensaio.Amos_Dh_Amostra = ( SELECT MIN(Reen2.Amos_Dh_Amostra) FROM Resultado_Ensaio Reen2 WHERE Resultado_Ensaio.Amos_Cd_Loc_Amostg = Reen2.Amos_Cd_Loc_Amostg AND Resultado_Ensaio.Amos_Cd_Tipo_Local = Reen2.Amos_Cd_Tipo_Local AND Reen2.Amos_Dh_Amostra >= TO_TIMESTAMP('1999-11-01 07:00', 'YYYY-MM-DD HH24:MI:SS') ) ) ) AND Resultado_Ensaio.Amos_Cd_Loc_Amostg like '314TQ5901%' ORDER BY Resultado_Ensaio.Amos_Dh_Amostra, Resultado_Ensaio.Amos_Cd_Loc_Amostg, Caract_Produto.Capr_Nm_Completo
- 核对所有绑定变量的名称,统一代码和配置中的变量名,确保OSB侧的数据库调用配置里,所有SQL中用到的变量都有对应的入参映射,没有遗漏。
- 调整OSB侧的参数传递顺序,和SQL中变量出现的顺序完全一致,适配JDBC位置匹配的规则。
- 先在PL/SQL Developer等SQL工具中使用绑定变量方式执行SQL,不要硬编码变量值,验证SQL本身的参数逻辑正确后,再排查OSB侧的配置问题。
内容的提问来源于stack exchange,提问作者user16728667
相关产品推荐
相关产品推荐

