Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 UPDATE через SELECT  [new]
daKe.ru
Member

Откуда: Украина, Киев
Сообщений: 22
Доброго времени суток.
Возникла проблема прошу у вас помощи в иё решении.
Имеем php+oci8 oracle 8.1.7
Нужно сделать выборку но так чтоб при этом сделать кпдайт в другой таблице. т.е человек запрашивает
пример
автор
select id, name, f_kod from ks_jurs where reg_num='111'

надо чтоб после этого запроса выполнялось следующие
автор
UPDATE pr_reg SET pr=pr+1 WHERE reg_id='111'

Теперь собственно сам вопрос можно ли такое выполнить в одном запросе?
P.S Знаю что можно тригер сделать или процедуру и запускать по мере надобности, но мне этот вариант не подхдит.
За ранние спасибо
20 май 08, 21:58    [5691432]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE через SELECT  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
select * from table(table_function_with_update())

Подробности см. в доке.

Надеюсь, это не оригинальный такой способ мониторить сколько раз запускается отчет...

daKe.ru
За ранние спасибо

А за поздние фиг? [ответы]
20 май 08, 22:30    [5691514]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE через SELECT  [new]
faig
Member

Откуда: Chicago ,IL
Сообщений: 146
daKe.ru
Доброго времени суток.
Возникла проблема прошу у вас помощи в иё решении.
Имеем php+oci8 oracle 8.1.7
Нужно сделать выборку но так чтоб при этом сделать кпдайт в другой таблице. т.е человек запрашивает
пример
автор
select id, name, f_kod from ks_jurs where reg_num='111'

надо чтоб после этого запроса выполнялось следующие
автор
UPDATE pr_reg SET pr=pr+1 WHERE reg_id='111'

Теперь собственно сам вопрос можно ли такое выполнить в одном запросе?
P.S Знаю что можно тригер сделать или процедуру и запускать по мере надобности, но мне этот вариант не подхдит.
За ранние спасибо

drop table pr_reg;

CREATE TABLE pr_reg
(
  pr       NUMBER,
  reg_id  VARCHAR2(400)
);

/

CREATE OR REPLACE PROCEDURE track (p_reg_id VARCHAR2)
IS
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
MERGE INTO pr_reg b
   USING (SELECT p_reg_id reg_id
            FROM DUAL) e
   ON (e.reg_id = b.reg_id)
   WHEN MATCHED THEN
      UPDATE
         SET pr = NVL (pr, 0) + 1
         WHERE reg_id = p_reg_id
   WHEN NOT MATCHED THEN
      INSERT (pr, reg_id)
      VALUES (1, p_reg_id);
	commit;
END;


CREATE OR replace FUNCTION dummy (p_reg_id VARCHAR2)
   RETURN NUMBER
AS
BEGIN
   track (p_reg_id);
   return 1;
END;

show error

select dummy('111') from dual;

select * from  pr_reg;

20 май 08, 22:49    [5691557]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE через SELECT  [new]
daKe.ru
Member

Откуда: Украина, Киев
Сообщений: 22
Всем большое спасибо, не ожидал что так быстро ответите )
Премного благодарен
20 май 08, 23:36    [5691659]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE через SELECT  [new]
рано радуешься.
Guest
daKe.ru
Всем большое спасибо, не ожидал что так быстро ответите )
Премного благодарен

update pr_reg set pr=&1 where reg_id=&2;
select dummy('111') from dual;

-- ooops
use update ... returning
20 май 08, 23:59    [5691701]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE через SELECT  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
daKe.ru
Всем большое спасибо, не ожидал что так быстро ответите )
Премного благодарен
Только ИМХО забудьте эти варианты и поменяйте постановку вопроса :) В конце концов Вы обретете столько граблей :) Селект не должен выполнять DML, даже если есть способы его заставить!

daKe.ru
P.S Знаю что можно тригер сделать
Что это Вы интересно такое имеете ввиду? :)
21 май 08, 10:36    [5692628]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить