Ошибка, которую вы получаете, кажется, не имеет смысла.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;