Вызов скалярной функции

pro100user
Дата: 12.06.2012 12:36:43
create procedure mul (a int,  b int)
returns (result int)
as
begin
  result=a*b;
end

update
  tbl
set
  f3=mul(f1,f2)

Не хочет :(
pro100user
Дата: 12.06.2012 12:44:26
Работает только
/* select * from mul(2,3); */
/* select mul(2,3) from rdb$database; */
execute procedure mul(2,3);

как полученный результат применить в update?
Dimitry Sibiryakov
Дата: 12.06.2012 12:57:10

pro100user
как полученный результат применить в update?

execute block as
declare a integer;
begin
   execute procedure mul(2,3) returning_values :a;
   update t set f=:a;
end

Posted via ActualForum NNTP Server 1.5

pro100user
Дата: 12.06.2012 13:06:12
А если апдейт с вхере:
update
tbl
set
f3=mul(f1,f2)
where
id in (select Id from sp(new.Id));

?
Oliph_
Дата: 12.06.2012 13:08:08
pro100user,
Для начала немного изменить процедуру:
create or alter procedure mul (a int,  b int)
returns (result int)
as
begin
  result=a*b;
  suspend; -- это важно
end
И затем использовать оператор MERGE:
merge into mytable t using (
select
  t.id,
  m.result
from
  mytable t
  left join mul(t.f1,t.f2) m on 1=1
) s
on (t.id = s.id) when matched then update set t.f3 = s.result
DarkMaster
Дата: 12.06.2012 13:30:29
pro100user,

А зачем тут вообще процедура?

update tbl
  set F1= :a * :b;
pro100user
Дата: 12.06.2012 13:33:54
Oliph_
Для начала немного изменить процедуру:
  suspend; -- это важно

Но suspend нужен для селективных процедур. Я же хочу использовать эту функцию как скалярную как внутри других хранимок
/* oracle */
r := mul(2, 3);

/* mssql */
set @r=dbo.mul(2,3)

так и в запросах
/* oracle */
update tbl set f3 = mul(f1, f2);
select mul(f1, f2) from tbl;

/* mssql */
update tbl set f3=dbo.mul(f1, f2)
select dbo.mul(f1, f2) from tbl
pro100user
Дата: 12.06.2012 13:36:13
DarkMaster
А зачем тут вообще процедура?

Для уяснения проблемы, а не для массовости. Если я вам выложу сюда хранимку, триггер и все потроха вам от этого понятнее станет?
WildSery
Дата: 12.06.2012 13:40:39
pro100user
Я же хочу использовать эту функцию как скалярную как внутри других хранимок

Такой синтаксис не поддерживается.
Расскажи толком, что нужно, и порекомендуем, как это сделать лучше.
pro100user
Дата: 12.06.2012 13:51:27
WildSery
Расскажи толком, что нужно, и порекомендуем, как это сделать лучше.

Уже ж все рассказал. Хотите конкретики? Есть таблица с иерархией. Одно из полей - материализованный путь. Функция - аналог оракловой sys_connect_by_path. На вход подается id, на выходе - материализованный путь. В тригере нужно отследить вставку и модификацию и подправить поле. Все.