Вопрос

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

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 

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

Это было полезно?

Решение

Ошибка, которую вы получаете, не имеет смысла. 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 будет видеть тот же счет, что и первый заявление SQL, если вы не можете гарантировать, что SOME_TABLE не модифицируется какими -либо другими сессиями в то же время, когда вы запрашиваете это. Как правило, я был бы довольно осторожен с необходимостью запустить запрос и выполнить отдельный счет- это обычно указывает на более основную проблему. Если вам нужен счет, чтобы соответствовать запросу, который вы запускаете, вы бы хотели добавить аналитический счет в свой запрос и позволить вызывающему вызыванию принести этот столбец.

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top