我正在尝试使用XML DB Service 将Oracle表作为Web服务公开。我想根据Web服务的请求中的条件返回多行表。
以下 - :本机-Oracle-xml-db-web-services-11gr1
开发了一个过程,该过程将PK列作为输入,并将列作为输出返回。当返回是按列返回时,它可以工作。但是,当我尝试将完整的行作为类型返回时,它不起作用。
这在工作。
Web服务的URL - :http://域:8080/orawsv/test/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表的多行,而无需硬编码列名。
我已将过程修改为
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