Курсор и "Отказ в доступе к DBMS_SQL"

hinotf
Дата: 28.10.2015 10:56:59
Добрый день!

Я понимаю, что ошибка есть, но сейчас не могу понять, отчего (на строке 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!
Elic
Дата: 28.10.2015 11:21:23
hinotf
DBMS_SQL.EXECUTE
Зачем?
dba123
Дата: 28.10.2015 11:28:22
hinotf,

может быть:
identifier 'BR' must be declared
hinotf
Дата: 28.10.2015 11:37:15
Я пока не готов ответить на уточняющие вопросы, проведу все исследования. Этот кодя вижу первый раз, но увы, вынужден его чинить. Кроме того, он, как оказалось, благополучно работает везде, кроме стенда разработки. Надо ещё получить текущий код с пром среды и сверить. Версии БД совпадают.
ArtNick
Дата: 28.10.2015 11:47:44
hinotf
Я пока не готов ответить на уточняющие вопросы, проведу все исследования. Этот кодя вижу первый раз, но увы, вынужден его чинить.

Думаешь автор кода прочитает этот форум и откликнется?
Elic
Дата: 28.10.2015 11:59:37
Где-то между DESCRIBE и CLOSE есть (рекурсивные) "кривые" обращения к DBMS_SQL, скрывающие кривизну.
Можно грабли присыпать листьями, сократив растояние между вышеупомянутыми вызовами до нуля.
Elic
Дата: 28.10.2015 12:01:18
hinotf
     WHEN NO_DATA_NEEDED THEN
       null;
Пейсатель много заборов прочитал.