Как вернуть таблицу в виде строки, используя веб-сервисы Oracle XML DB - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь представить таблицу Oracle в качестве веб-службы, используя службу XML DB .Я хочу вернуть несколько строк таблицы в зависимости от того, где условие передано в запросе веб-службы.

После -: native-oracle-xml-db-web-services-11gr1

Разработана процедура, которая принимает столбец PK в качестве входных данных и возвращает столбец в качестве выходных данных.Это работает, когда возвращение столбец за столбцом.Но когда я пытаюсь вернуть всю строку как тип, она не работает.

Это работает.

URL веб-сервиса -: http://domain:8080/orawsv/TEST/GET_TEST_TAB?wsdl

create or replace PROCEDURE GET_TEST_TAB (
  p_id   IN  test_tab.id%TYPE,
  p_description   OUT test_tab.description%type) AS
  BEGIN

      SELECT description into p_description   FROM   test_tab
  WHERE  id = p_id;
END GET_TEST_TAB;

Теперь я хочу вернуть несколько строк таблицы TEST_TAB без жесткого кодирования имени столбца.

1 Ответ

0 голосов
/ 09 июля 2019

Я изменил процедуру как

CREATE OR replace PROCEDURE P_TableAsWS_XMLIN_XMLOUT (
    p_in    IN XMLTYPE,
    p_out   OUT XMLTYPE
) AS
  BEGIN
--  cursor_ OUT SYS_REFCURSOR) AS
--  with data as
--(select '<a><c>1</c><c>2</c></a>' xmlval
-- from dual)
    SELECT
        XMLELEMENT(
            "employees",XMLAGG(XMLELEMENT(
                "employee",XMLFOREST(e.id AS "empno",e.description AS "ename")
            ) )
        ) 
    INTO p_out
    FROM
        test_tab e,

                XMLTABLE ( '/inp/*' PASSING  p_in 
                    COLUMNS
                        id  varchar(50)   PATH '/id'
                )  inp
WHERE
  e.id = inp.id  ;

end P_TableAsWS_XMLIN_XMLOUT;

Передача ввода -:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:p="http://xmlns.oracle.com/orawsv/TEST/P_TABLEASWS_XMLIN_XMLOUT">
   <soapenv:Header/>
   <soapenv:Body>
      <p:P_TABLEASWS_XMLIN_XMLOUTInput>
         <p:P_OUT-XMLTYPE-OUT/>
         <p:P_IN-XMLTYPE-IN>
            <inp>
             <id>1</id>
             <id>2</id>
            </inp>
         </p:P_IN-XMLTYPE-IN>
      </p:P_TABLEASWS_XMLIN_XMLOUTInput>
   </soapenv:Body>
</soapenv:Envelope>

Получение вывода -:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <P_TABLEASWS_XMLIN_XMLOUTOutput xmlns="http://xmlns.oracle.com/orawsv/TEST/P_TABLEASWS_XMLIN_XMLOUT">
         <P_OUT>
            <employees>
               <employee>
                  <empno>1</empno>
                  <ename>ONE</ename>
               </employee>
               <employee>
                  <empno>2</empno>
                  <ename>TWO</ename>
               </employee>
            </employees>
         </P_OUT>
      </P_TABLEASWS_XMLIN_XMLOUTOutput>
   </soap:Body>
</soap:Envelope>

Проблема заключается в -:

a) Я вручную добавил каждый столбец в процедуру.Если добавлен какой-либо новый столбец, процедуру необходимо изменить

b) Тип выходного столбца XMLTABLE должен быть жестко запрограммирован.Невозможно определить столбец как TABLE_NAME.COLUM_NAME% TYPE

...