powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов динамического SQL из SQL
8 сообщений из 8, страница 1 из 1
Вызов динамического SQL из SQL
    #40079019
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал функцию, в которой используется динамический SQL:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function get_price(pv_price_proc in varchar2, pn_prod_id in number, pd_date in date) return number is  
  lv_stmt varchar2(255);
  lv_price number;
begin
  lv_price := null;

  lv_stmt := 'BEGIN :lv_price := '||pv_price_proc||'('||pn_prod_id||', '||to_char(pd_date,'DD.MM.YYYY')||'); END;';
  EXECUTE IMMEDIATE lv_stmt USING IN OUT lv_price;

  return lv_price;
end;


Пытаюсь эту функцию вызывать в запросе:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
select 
        o.order_id,
        get_price(o.price_proc, o.prod_id, o.order_date) as price
from 
        orders o
where 
    o.order_date = sysdate 



Оракл ругается, говорит, что функция get_price не может быть использована в SQL.

где orders - таблица неких заказов на дату неких продуктов (prod_id). Эта таблица в поле price_proc содержит наименование некой функции, которая рассчитывает цену продукта на дату. Поэтому то и приходится использовать динамический SQL.

Как бы так сделать, чтобы можно было эту функцию get_price использовать?
...
Рейтинг: 0 / 0
Вызов динамического SQL из SQL
    #40079027
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
Код: plsql
1.
  lv_stmt := 'BEGIN :lv_price := '||pv_price_proc||'('||pn_prod_id||', '||to_char(pd_date,'DD.MM.YYYY')||'); END;';

Выведи полученную строку, что понять, какая это хрень.
Тебе уже объясняли, что нужно использовать bind-переменные, а ты по-прежнему и так же неумело пытаешься их впечатывать. Более того, явно путаешься в типах.
verter
Оракл ругается, говорит, что функция get_price не может быть использована в SQL.
Нет такой ошибки у Oracle-а.
...
Рейтинг: 0 / 0
Вызов динамического SQL из SQL
    #40079030
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
Код: plsql
1.
2.
3.
  lv_price number;
begin
  lv_price := null;

А это говорит об отсутствии базового понимания PL/SQL.
Тебе рано лезть в динамику.
...
Рейтинг: 0 / 0
Вызов динамического SQL из SQL
    #40079045
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
verter
Код: plsql
1.
2.
3.
  lv_price number;
begin
  lv_price := null;

А это говорит об отсутствии базового понимания PL/SQL.
Тебе рано лезть в динамику.


ОК, lv_price := to_number(null);
...
Рейтинг: 0 / 0
Вызов динамического SQL из SQL
    #40079046
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic

Код: plsql
1.
  lv_stmt := 'BEGIN :lv_price := '||pv_price_proc||'('||pn_prod_id||', '||to_char(pd_date,'DD.MM.YYYY')||'); END;';



Вот так нужно?

Код: plsql
1.
2.
lv_stmt := 'select :pv_price_proc (:pn_prod_id, :pd_date) from dual';
EXECUTE IMMEDIATE lv_stmt into lv_price USING pv_price_proc, pn_prod_id, pd_date;
...
Рейтинг: 0 / 0
Вызов динамического SQL из SQL
    #40079060
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
ОК, lv_price := to_number(null);
"Заставь дурака богу молиться …"
verter
Вот так нужно?
Код: plsql
1.
lv_stmt := 'select :pv_price_proc (:pn_prod_id, :pd_date) from dual';

<censored>
...
Рейтинг: 0 / 0
Вызов динамического SQL из SQL
    #40079190
freecozoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько мне известно, DML-операции нельзя использовать в select-выражениях, в том числе если они обернуты в функцию. По крайней мере в 11 так. Не думаю что в новых версиях по другому.
...
Рейтинг: 0 / 0
Вызов динамического SQL из SQL
    #40079191
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
freecozoid
DML-операции нельзя использовать в select-выражениях
Телепат?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов динамического SQL из SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]