Идея пак търся...

8 отговора 0 прегледа
#1

Идея пак търся...

Запецнах и от вчера си блъскам главата... обаче откъм идеи йок.
Та имам си една таблица ZPROGRAM с полета
ID - number(10)
PDATE - DATE
MACHINE - NUMBER(2)
ACTIVE - NUMBER(1) BY DEFAULT 0 (0- NON ACTIVE, 1 ACTIVE)

За всяка една машина винаги има една и само една программа, която е актив. Когато се въседе нова програма за машината предишната программа става 0, т.е non active.
Когато се изтрие една программа, предходната программа за тази машина трябва да стане актив (1) на базата на максималната дата.
т.е
update zprogram z set active=1
where (z.machine,z.pdate) in (select zp.machine,max(zp.pdate) from zprogram zp group by zp.machine);

Проблемът ми е, че това чудо не мога да го пльосна в trigger. Не става и от тригер да извикам procedure за update.

Та, всякакви идеи са добре дошли....

Тъпо, обаче както казах зацепих....

Отговор
в отговор на AйeзCeдaй #2

Re: Идея пак търся...

Това може да стане само ако имаш UNIQUE CONSTRAINT по (MACHINE, PDATE) -- нали разбираш как CONSTRAINT-ите обясняват данните. Виж и този SQL
UPDATE ZPROGRAM

SET ACTIVE = CASE WHEN PDATE = (
SELECT MAX(PDATE)
FROM ZPROGRAM z
WHERE z.MACHINE = ZPROGRAM.MACHINE
) THEN 1 ELSE 0 END
WHERE ACTIVE <> CASE WHEN PDATE = (
SELECT MAX(PDATE)
FROM ZPROGRAM z
WHERE z.MACHINE = ZPROGRAM.MACHINE
) THEN 1 ELSE 0 END

WHERE клаузата е за да пипа само нужното -- може и без нея


[линк]
Отговор
в отговор на wqw #3

Re: Идея пак търся...

Въпросът ми е къде по дяволите до го изпълнявам този ъпдейт?
Да, имам естествено...

Отговор
в отговор на AйeзCeдaй #4

Re: Идея пак търся...

А защо не можеш да го пльоснеш в trigger? Нали имаш или INSERT или DELETE?

Everything louder than everything else...
Отговор
в отговор на Dakota #5

Re: Идея пак търся...

Ами щото не става.
Ако напиша един триггер от сорта на

create or replace trigger AAAAA
after delete on table_name
for each row...

ти дава грешка ORA-04091 user.table (мойте в случая нямат значение) is mutating trigge/function may not see it...
Ако triggeр е enable, не можеш да делитваш.


Пък и оракле изрично си пише, че в trigger After delete
You can not update the :OLD values.

Те, за това търся идеи...
Ако в тригера има процедура, пак се получава същата грешка...

Редактирано от AйeзCeдaй на

Отговор
в отговор на AйeзCeдaй #6

FOR EACH STATEMENT

Нямам опит с Oracle, но не можеш ли да му кажеш да не е FOR EACH ROW, ами FOR EACH STATEMENT?

Иначе в PostgreSQL използвам такива спусъци - AFTER DELETE ... FOR EACH ROW и там имам достъп до OLD (за четене), NEW няма - ясно.

Но като цяло, би трябвало да имаш достъп за четене до OLD... а дори и да нямаш, би трябвало да можеш да изпълниш заявка върху същата таблица?... Не разбирам откъде идва ограничението.

Everything louder than everything else...
Отговор
в отговор на Dakota #7

Re: FOR EACH STATEMENT

Огорчението идва от там, че с триггер няма да стане хавата..
Да, достъп имам за четене на Old, но не и за update (това, което на мен ми трябва).
Да, query-та select ... мога да изпълнявам, но ....не е това целта....

хм, сега говорейки ми светна нщо... отивам да пробвам .....

Отговор
в отговор на AйeзCeдaй #8

Re: FOR EACH STATEMENT

Доколкото разбирам тригера ти трябва за insert и delete. С ROW LEVEL тригер няма да стане - в него не можеш да селектваш или променяш таблицата. Пробвай с TABLE LEVEL тригер - лошото е че с него ще ъпдейтваш всички машини в таблицата, на всеки insert и delete.

Отговор
в отговор на Beceляk У #9

Тц

Тц. Пак не става. Пробвах и това.

Отговор