从refcursor oracle返回多个XML



Oracle数据库中有一个过程,它接受一个日期范围,并为每天生成XML文件,返回类型为ref cursor。

当从c#代码中调用该过程时,我无法从游标中提取XML。任何指针都将有助于如何提取XML

下面给出的是查询的小示例,它从过程调用返回XML作为ref游标。

PROCEDURE GET_XML_DATERANGE(
start_date IN DATE,
end_date IN DATE,
p_cursor_xml OUT SYS_REFCURSOR
)
IS
V_CURSOR SYS_REFCURSOR;
BEGIN
OPEN V_CURSOR FOR
WITH DATES AS(
SELECT (to_date(start_date ,'yyyy-mm-dd') + rownum -1) as d_date
FROM ALL_OBJECTS
WHERE rownum <= to_date(end_date,'yyyy-mm-dd')-to_date(start_date,'yyyy-mm-dd')+1
)
SELECT XMLELEMENT("ExampleXML", 
XMLATTRIBUTES('1.1.1.1' AS "version",
REPLACE(to_char((d.d_date),'yyyy-mm-dd HH:MM:SS'),' ','T') AS "timeStamp"
)) from DATES d;
p_cursor_xml := V_CURSOR ;
END GET_XML_DATERANGE;

根据查询,它为作为ref游标返回的每个日期返回多个XML。只是想要一些关于如何从ref游标中提取多个xml的指针,这将是c#代码的输出参数。

你的代码有一些问题(包括调用TO_DATE的值已经是日期),可以更简单;然而,主要的变化是在创建的元素上调用.getStringVal(),因为这会将其从XMLTYPE数据类型转换为VARCHAR2字符串,然后您可以像从返回的游标的每一行获取任何其他字符串一样获取XML:

CREATE PROCEDURE GET_XML_DATERANGE(
start_date IN DATE,
end_date IN DATE,
p_cursor_xml OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN p_cursor_xml FOR
SELECT XMLELEMENT(
"ExampleXML", 
XMLATTRIBUTES(
'1.1.1.1' AS "version",
to_char(TRUNC(start_date) + LEVEL - 1, 'yyyy-mm-dd"T"HH24:MI:SS')
AS "timeStamp"
)
).getStringVal() AS xml
FROM   DUAL
CONNECT BY LEVEL <= TRUNC(end_date)-TRUNC(start_date) + 1;
END GET_XML_DATERANGE;
/

如果您生成的数据对于VARCHAR2来说太大,那么使用.getClobVal()代替。

最新更新