Как использовать функцию описанную внутри процедцры в SQL?

Gogol
Дата: 28.09.2015 19:18:36
Создаю процедуру:
CREATE OR REPLACE PROCEDURE  prc_test 
AS  
  v_num   number;
  FUNCTION ActionConditions(p_id in number) 
  RETURN PLS_INTEGER
  IS
    v_id PLS_INTEGER := 1;
  BEGIN
    SELECT p_id as id into v_id FROM dual;
    RETURN v_id;
  END;
BEGIN
  SELECT ActionConditions(1) into v_num FROM dual;
  DBMS_OUTPUT.Put_Line( v_num );  
END;


Получаю:
PLS-00231: function 'ACTIONCONDITIONS' may not be used in SQL
-2-
Дата: 28.09.2015 19:21:09
Gogol,

v_num := ActionConditions(1);
Vadim Lejnin
Дата: 28.09.2015 19:22:07
Gogol
Создаю процедуру:
CREATE OR REPLACE PROCEDURE  prc_test 
AS  
  v_num   number;
  FUNCTION ActionConditions(p_id in number) 
  RETURN PLS_INTEGER
  IS
    v_id PLS_INTEGER := 1;
  BEGIN
    SELECT p_id as id into v_id FROM dual;
    RETURN v_id;
  END;
BEGIN
  SELECT ActionConditions(1) into v_num FROM dual;
  DBMS_OUTPUT.Put_Line( v_num );  
END;


Получаю:
PLS-00231: function 'ACTIONCONDITIONS' may not be used in SQL


SQL != PL/SQL - это разные движки
соответственно SQL оператор находится вне области видимости prc_test

но можно выполнить:
v_num := ActionConditions(1);
Gogol
Дата: 28.09.2015 19:24:50
Нет нужно использование функции именно в SQL.
Приведенный код упрощен.
Реально функция должна была использоваться в условии выборки во многих запросах в т.x. и циклах for чтобы не повторять одно и тоже условие десять раз.
Gogol
Дата: 28.09.2015 19:25:47
а выносить функцию в отдельную не хотелось бы.
Gogol
Дата: 28.09.2015 19:27:47
Кто как решает проблему повторяющегося кода в условии выборки в разных запросах?
ArtNick
Дата: 28.09.2015 19:48:09
Gogol
Кто как решает проблему повторяющегося кода в условии выборки в разных запросах?

объявляю и использую, религия позволяет
create or replace function func_example  return number as begin return 1; end;

with t as
(select 1 id from dual
 union all
 select 2 from dual)
select * from t where id=func_example

ID
1
stax..
Дата: 28.09.2015 20:13:12
Gogol
Нет нужно использование функции именно в SQL.
Приведенный код упрощен.
Реально функция должна была использоваться в условии выборки во многих запросах в т.x. и циклах for чтобы не повторять одно и тоже условие десять раз.

шо делать, надо создавать ф-цію
я вот был купился на местных гуру, что преславутое переключение контекста уже не так важно
но!!! недавно запостили новую (для меня) прагму, мол ф-ция будет пользоваться переважно в SQL, неспроста ето

.....
stax
Да ну
Дата: 28.09.2015 20:57:56
Gogol
Кто как решает проблему повторяющегося кода в условии выборки в разных запросах?

Хотите все держать рядом, используйте пакеты.
kva6513
Дата: 28.09.2015 22:56:45
Gogol,

Если не секрет - зачем такие выкрутасы ? Замедлить скорость обработки пытаетесь ? :) С переключениями контекста все не так радужно, как хотелось-бы, даже в 12-й версии с новой прагмой UDF, а про более ранние версии и речи нет...
Не, если запрос, который будет дергать такие функции (внутри которых - опять запрос) обрабатывает несколько сотен строк - еще куда ни шло... Но на серьезных объемах - это будет тормоз. Есть жеж WITH-кляуза у SELECT, собирайте туда, что хотите выделить из основного запроса.