Динамический SQL и поле out в процедуре оракула - PullRequest
0 голосов
/ 29 ноября 2011

Я получаю сообщение об ошибке, когда использую это:

PROCEDURE GET_BY_CRIT(vchFilter varchar2(500),
                      intCantTotal OUT INT,
                      curResult OUT sys_refcursor)
IS
BEGIN

    OPEN curResult FOR
    'SELECT COLUMN1,COLUMN2 FROM SOME_TABLE WHERE '||vchFilter

    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SOME_TABLE WHERE '||vchFilter 
    INTO intCantTotal 
END

Ошибка:

ORA-00936: missed expression 

Но когда я выполняю каждое предложение отдельно, оно выполняется корректно.

1 Ответ

1 голос
/ 29 ноября 2011

Ошибка, которую вы получаете, кажется, не имеет смысла.Oracle должен выдавать ошибку компиляции, потому что параметры функций не имеют длины.vchFilter должен быть объявлен как VARCHAR2, а не VARCHAR2(500).

Кроме того, как отметил Лоло в комментариях, операторы в блоке PL / SQL должны заканчиваться точкой с запятой.

PROCEDURE GET_BY_CRIT(vchFilter varchar2,
                      intCantTotal OUT integer,
                      curResult OUT sys_refcursor)
IS
BEGIN
    OPEN curResult FOR
    'SELECT COLUMN1,COLUMN2 FROM SOME_TABLE WHERE '||vchFilter;

    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SOME_TABLE WHERE '||vchFilter 
    INTO intCantTotal;
END;

Также следует помнить, что нет никакой гарантии, что второй оператор SQL увидит тот же COUNT, что и первый оператор SQL, если только вы не можете гарантировать, что SOME_TABLE не изменяется другими сеансами в том жераз вы спрашиваете это.Как правило, я бы с осторожностью относился к необходимости запуска запроса и выполнения отдельного подсчета, что обычно указывает на более основную проблему.Если вам нужно, чтобы COUNT соответствовал выполняемому запросу, вам нужно добавить аналитический COUNT в свой запрос и позволить вызывающей стороне получить этот столбец.

PROCEDURE GET_BY_CRIT(vchFilter varchar2,
                      curResult OUT sys_refcursor)
IS
BEGIN
    OPEN curResult FOR
    'SELECT COLUMN1,COLUMN2, COUNT(*) OVER () cnt FROM SOME_TABLE WHERE '||vchFilter;
END;
...