Динамическое SQL и полю Out в процедуре Oracle
-
25-10-2019 - |
Вопрос
Я получаю ошибку, когда использую это:
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;