0

我正在尝试使用 XML DB Service 将 Oracle 表公开为 Web 服务。我想根据 Web 服务的请求中传递的条件返回多行表。

以下-: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 表的多行,而不用硬编码列名。

4

1 回答 1

0

我已将程序修改为

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

于 2019-07-09T11:25:44.170 回答