В данный момент у меня нет доступа к БД Oracle, поэтому, пожалуйста, прости неточности.
Похоже, что параметризация вызова DBMS_XMLGEN
является целью.Это достигается с помощью небольшого PL / SQL. Документы Oracle для пакета DBMS_XMLGEN описывают несколько операций, которые должны помочь.Сначала создайте контекст из SYS_REFCURSOR, используя эту форму:
DBMS_XMLGEN.NEWCONTEXT (
queryString IN SYS_REFCURSOR)
RETURN ctxHandle;
Затем используйте контекст в другой форме GetXML
:
DBMS_XMLGEN.GETXML (
ctx IN ctxHandle,
tmpclob IN OUT NCOPY CLOB,
dtdOrSchema IN number := NONE)
RETURN BOOLEAN;
Использование этого метода также дает преимуществопотенциального повторного использования CLOB (без создания нового временного), что может помочь с производительностью.Есть другая форма, которая больше похожа на ту, которую вы использовали в своем примере, но теряет это свойство.
Еще одна вещь ... Возвращение GETXML
в этом примере должно сказать вам, были ли строкивернулся или нет.Это должно быть более надежным, чем проверка содержимого CLOB после завершения операции.Кроме того, вы можете использовать функцию NumRowsProcessed
в контексте, чтобы получить количество строк, включенных в CLOB.
Грубо говоря, ваш код будет выглядеть примерно так:
DECLARE
srcRefCursor SYS_REFCURSOR;
ctxHandle ctxHandle;
somevalue VARCHAR2(1000);
myClob CLOB;
hasRows boolean;
BEGIN
OPEN srcRefCursor FOR
SELECT c1, c2
FROM t1
WHERE c1 = somevalue; --Note parameterized value
ctxHandle := DBMS_XMLGEN.NEWCONTEXT(srcRefCursor);
hasRows := DBMS_XMLGEN.GETXML(
ctxHandle,
myClob -- XML stored in myCLOB
);
IF (hasRows) THEN
/* Do work on CLOB here */
END IF;
DBMS_XMLGEN.CLOSECONTEXT(ctxHandle);
END;