我希望能够使用Oracle 11g SOA Suite数据库适配器创建一个服务,该服务将列表作为输入。所以我希望能够为getCountries操作提供countryId列表。
我找到了this链接。它工作但它打破了包含分隔字符的参数,因此它不理想。
我一直在尝试使用一个集合作为输入和输出的函数,并使用for-each构造来进行映射。但无法让它发挥作用。我不确定DBAdapeter能否解决这个问题。
有人试过这样的事吗?
答案 0 :(得分:2)
你可以这样做 - 让参数(pCountryList
)成为一个字符串。
要使其工作,您需要将列表作为有效的XML文档提供
<?xml version="1.0"?>
<Countries>
<Country><ID>MyCountyID 01</ID></Country>
<Country><ID>777</ID></Country>
<Country><ID>ID__3</ID></Country>
</Countries>
然后,您需要创建一个带有子选择的查询,该子选择将XML转换为行(每行包含XML中的一个国家/地区ID)
SELECT * FROM MyTable WHERE CountryID IN
(
SELECT extractvalue(column_value, '/Country/ID') ContryID
FROM TABLE(XMLSequence(XMLTYPE(:pCountryList).extract('/Countries/Country'))) t);
此查询采用国家/地区ID列表(打包成XML字符串),并可与 Oracle 11g SOA Suite数据库适配器一起使用。
答案 1 :(得分:0)
例如,将参数设置为分隔字符串时,还有另一种可能的方法:
其中#parameter是简单的分隔字符串:“'1,2,3,4,5,6,7,8,9,10'”
SELECT UA,UB FROM CU WHERE UA in(SELECT SUBSTR(STRING_TO_TOKENIZE,DECODE(LEVEL,1,1,INSTR(STRING_TO_TOKENIZE,DELIMITER,1,LEVEL-1)+1),INSTR(STRING_TO_TOKENIZE,DELIMITER,1,级别) - 解码(LEVEL,1,1,INSTR(STRING_TO_TOKENIZE,DELIMITER,1,LEVEL-1)+1))FROM(SELECT #parameter ||','AS STRING_TO_TOKENIZE','AS DELIMITER FROM DUAL)CONNECT BY INSTR(STRING_TO_TOKENIZE,DELIMITER,1,LEVEL)&gt; 0)
诀窍在于以下子查询,因为它从分隔的字符串返回已解析的行:
SELECT SUBSTR(STRING_TO_TOKENIZE,DECODE(LEVEL,1,1,INSTR(STRING_TO_TOKENIZE,DELIMITER,1,LEVEL-1)+1), INSTR(STRING_TO_TOKENIZE,DELIMITER,1,LEVEL) - 解码(LEVEL,1,1,INSTR(STRING_TO_TOKENIZE,DELIMITER,1,LEVEL-1)+1))FROM (SELECT'1,2,3,4,5,6,7,8,9,10'||','AS STRING_TO_TOKENIZE','AS DUIMITER FROM DUAL)由INSTR连接(STRING_TO_TOKENIZE,DELIMITER,1,LEVEL )大于0