Oracle 11g SOA Suite База данных адаптер принимает список в качестве входных данных - PullRequest
0 голосов
/ 20 октября 2011

Я хотел бы иметь возможность создать сервис с Oracle 11g SOA Suite Database Adapter, который принимает список в качестве входных данных.Поэтому я хотел бы иметь возможность предоставить операции getCountries список countryId.

Я нашел эту ссылку.Это работает, но разбивается на параметр, который содержит символ-разделитель, поэтому он не идеален.

Я пытался использовать функцию, имеющую коллекцию в качестве входных данных и в качестве выходных данных, и использовать конструкции for-each для отображения.Но не могу заставить его работать.Я не уверен, что DBAdapeter справится с этим.

Кто-нибудь пробовал что-то подобное?

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Вы можете сделать это - сделать этот параметр (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)

SELECT * FROM MyTable WHERE CountryID IN
(
SELECT extractvalue(column_value, '/Country/ID') ContryID
FROM TABLE(XMLSequence(XMLTYPE(:pCountryList).extract('/Countries/Country'))) t);

Этот запрос принимает список идентификаторов стран (упакован в строку XML) и может использоваться с Адаптер базы данных Oracle 11g SOA Suite .

0 голосов
/ 07 декабря 2012

Существует другой возможный способ задания параметра в виде строки с разделителями , например:

где #parameter - простая строка с разделителями: "'1,2,3,4,5,6,7,8,9,10'"

ВЫБРАТЬ UA, UB ИЗ CU, ГДЕ UA в (ВЫБРАТЬ SUBSTR (STRING_TO_TOKENIZE, DECODE (УРОВЕНЬ, 1, 1, INSTR (STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1) +1), INSTR (STRING_TO_TOKENIZE, DELIM, DEL LEVEL) - DECODE (LEVEL, 1, 1, INSTR (STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1) +1)) FROM (SELECT #parameter || ',' AS STRING_TO_TOKENIZE, ',' AS DELIMITER FROM DUAL) СОЕДИНИТЬ ПО INSTR (STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)> 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)) ОТ (ВЫБЕРИТЕ 1,2,3,4,5,6,7,8,9,10 '||', 'AS STRING_TO_TOKENIZE,', 'КАК РАЗДЕЛИТЕЛЬ ИЗ ДВОЙНОГО) ПОДКЛЮЧИТЕ ПО INSTR (STRING_TO_TOKENIZE, РАЗДЕЛИТЕЛЬ, 1, УРОВЕНЬ )> 0

...