Добрый день!
Я понимаю, что ошибка есть, но сейчас не могу понять, отчего (на строке DBMS_SQL.CLOSE_CURSOR (c)):
PROCEDURE PARSE_QUERY (inQuery IN CLOB, --обрабатываемый запрос
inStrOut IN VARCHAR2, --шаблон выходной строки, :col_name - название колонки
outStr OUT NOCOPY CLOB, --выходная сгенерированная строка
boolBr IN VARCHAR2 DEFAULT 'N', --если Y то все переносы удаляются, если N то остаются
inCol IN VARCHAR2 DEFAULT NULL
)
IS
c NUMBER;
d NUMBER;
col_cnt INTEGER;
f BOOLEAN;
rec_tab DBMS_SQL.DESC_TAB;
rec_row DBMS_SQL.DESC_REC;
col_num NUMBER;
strpars VARCHAR2 (32767);
v_col_type VARCHAR2(100);
v_hide VARCHAR2(1);
BEGIN
c := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE (c, inQuery, DBMS_SQL.NATIVE);
d := DBMS_SQL.EXECUTE (c);
DBMS_SQL.DESCRIBE_COLUMNS (c, col_cnt, rec_tab);
col_num := rec_tab.FIRST;
IF (col_num IS NOT NULL)
THEN
LOOP
rec_row := rec_tab (col_num);
IF inCol is null THEN
strpars := PARSE_QUERY_STRING(inStrOut, rec_row);
outStr := CONCAT (outStr, br);
ELSE
strpars := null;
FOR rec_col IN (select val1, val2 from TABLE(SPLIT2(inCol))) LOOP
IF rec_col.val1 = rec_row.col_name THEN
IF rec_col.val2 = 'HIDE' THEN
v_hide := 'Y';
ELSE
v_hide := 'N';
END IF;
strpars := PARSE_QUERY_STRING(inStrOut, rec_row, v_hide);
outStr := CONCAT (outStr, br);
EXIT;
END IF;
END LOOP;
END IF;
outStr := CONCAT (outStr, TO_CLOB(strpars));
col_num := rec_tab.NEXT (col_num);
EXIT WHEN (col_num IS NULL);
END LOOP;
END IF;
IF outStr IS NULL THEN
outStr := PARSE_QUERY_STRING(inStrOut);
END IF;
outStr := REPLACE (outStr, TO_CLOB(':count_col'), TO_CLOB(rec_tab.COUNT));
IF boolBr = 'Y' THEN
outStr := REPLACE (outStr, br, TO_CLOB(''));
END IF;
DBMS_SQL.CLOSE_CURSOR (c);
EXCEPTION
WHEN NO_DATA_NEEDED THEN
null;
END;
Aiya Eärendil Elenion Ancalima!