Есть в теле пакета функция внутри этой функции выполняется огромный запрос, состоящий из объедитения нескольких. Так вот в каждом из 3 подзапросов встречается конструкция CASE. Сейчас появилась необходимость добавить в результат запроса еще пару полей, среди которых нужно сделать точно такой же CASE, только по другому полю. Дабы не плодить одинаковый код я решил вынести CASE в отдельную функцию. И вот что я обнаружил: нельзя вместо CASE внутри SQL вызывать ни приватные функции пакета, ни подфункции вызывающей функции. Собственно, как бы это обойти без публичных функций пакета?
Вот схема того, что я выше написал:
CREATE OR REPLACE PACKAGE pkg
AS
FUNCTION my_function(
<список_входных параметров>
) RETURN NUMBER;
END pkg;
CREATE OR REPLACE PACKAGE BODY pkg
IS
FUNCTION case_func(
field_value IN NUMBER
) RETURN NUMBER
IS
BEGIN
...
END case_func;
FUNCTION my_function(
<список_входных параметров>
) RETURN NUMBER
IS
BEGIN
...
FOR rec (
SELECT ...
-- вот так сейчас есть
, CASE WHEN NVL(some_table.field1, 0) = 0 THEN ... ELSE ... END
, CASE WHEN NVL(some_table.field2, 0) = 0 THEN ... ELSE ... END
/* вот так хотелось бы, но не получается
, case_func(some_table.field1)
, case_func(some_table.field2)
*/
...
FROM ...
UNION ALL
SELECT ...
-- вот так сейчас есть
, CASE WHEN NVL(some_table.field1, 0) = 0 THEN ... ELSE ... END
, CASE WHEN NVL(some_table.field2, 0) = 0 THEN ... ELSE ... END
/* вот так хотелось бы, но не получается
, case_func(some_table.field1)
, case_func(some_table.field2)
*/
...
FROM ...
UNION ALL
SELECT ...
-- вот так сейчас есть
, CASE WHEN NVL(some_table.field1, 0) = 0 THEN ... ELSE ... END
, CASE WHEN NVL(some_table.field2, 0) = 0 THEN ... ELSE ... END
/* вот так хотелось бы, но не получается
, case_func(some_table.field1)
, case_func(some_table.field2)
*/
...
FROM ...
) LOOP
END LOOP;
...
END my_function;
END pkg;