Oracle 11g SOA Suite数据库适配器接受列表作为输入

时间:2011-10-20 15:35:15

标签: web-services soa jdeveloper

我希望能够使用Oracle 11g SOA Suite数据库适配器创建一个服务,该服务将列表作为输入。所以我希望能够为getCountries操作提供countryId列表。

我找到了this链接。它工作但它打破了包含分隔字符的参数,因此它不理想。

我一直在尝试使用一个集合作为输入和输出的函数,并使用for-each构造来进行映射。但无法让它发挥作用。我不确定DBAdapeter能否解决这个问题。

有人试过这样的事吗?

2 个答案:

答案 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