Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Trigger dla INSERT.. problem składniowy, proszę o sugestie
mikajlo
post
Post #1





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 13.12.2010

Ostrzeżenie: (0%)
-----


Witam,
jestem początkującym samoukiem i potrzebuję utworzyć trigger, który po wstawieniu danych do tabeli T1, wstawi jedną z wstawionych wartości do tabeli T2.
Z tym, że jeśli wartość ta jest null albo "" (czyli defacto pusta) ma nie wykonywać inserta..

Akutalnie wygląda to tak:

  1.  
  2. DELIMITER $$
  3. CREATE TRIGGER insertClub AFTER INSERT ON users
  4. FOR EACH ROW BEGIN
  5. SET @var = NEW.clubUser;
  6. IF (@var IS NOT NULL OR @var <> '') THEN
  7. INSERT INTO kluby (nameClub) VALUES(@var);
  8. END IF;
  9. END$$
  10. DELIMITER ;


I do tabeli T2 dodawane są nowe wartości.. ale są również dodawane wartości puste ( '' ) które nie mają być dodawane.. (ma po prostu nie robić tego kroku).

Pewnie jest jakiś niewielki błąd.. Średniozaawansowani nie będą pewnie na pierwszy rzut oka zauważą co jest nie tak..
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mikajlo
post
Post #2





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 13.12.2010

Ostrzeżenie: (0%)
-----


Mój błąd.. tam ma być przekazana do procedury zmienna Data

Witam po dłuższej przerwie..
prace z triggerem zostały na moment wstrzymane ale teraz trzeba to dokończyc..

Z racji ograniczeń triggera w związku z tworzeniem nowych tabel zastanawiam się czy jest możliwość takiego rozwiązania..
(są to jeszcze niedopracowane składniową rozwiązania..)

EDIT:
Po prawie dwóch godzinach myślenia nad kodem mam taki komunikat:
"Dynamic SQL is not allowed in stored function or trigger"

Co w przygotowanym poniżej kodzie może wywoływać taki komunikat? I jak sobie z tym poradzić?




Tworzę trigger, który wywołuje w sobie procedure, która otrzymuje jako parametr datę z operacji triggera..
  1. DELIMITER //
  2. CREATE TRIGGER createTableWyniki AFTER INSERT ON zawodynazwa
  3. FOR EACH ROW
  4. BEGIN
  5. #SET @data = (SELECT YEAR(dataZawody) FROM zawodynazwa WHERE dataZawody = NEW.dataZawody);
  6. CALL procCreateTableWyniki(NEW.dataZawody);
  7. END//
  8. DELIMITER ;


a procedura ma za zadanie utworzyć nową tabele, która w nazwie tabeli ma mieć przekazany wcześniej rok, coś na wzór - wyniki_2013
(tylko tutaj chyba trzeba skorzystać z polecenia PREPARE do utworzenia tej zmiennej tablicowej ? Dokładnie nie wiem jak to może/powinno wyglądać..)
  1. DELIMITER //
  2. CREATE PROCEDURE procCreateTableWyniki(IN dataORG CHAR(10))
  3. BEGIN
  4. SET @dataMOD = (SELECT YEAR(dataZawody) FROM zawodynazwa WHERE dataZawody = dataORG); #tutaj z daty '2013-01-01' chce dalej wyciągnąć tylko rok '2013'
  5. SET @wynikiTab = CONCAT('wyniki_',@dataMOD);
  6. SET @sql = CONCAT('CREATE TABLE ',@wynikiTab,' (idWynik int(50) NOT NULL AUTO_INCREMENT)');
  7.  
  8. IF NOT EXISTS (SELECT * FROM lata WHERE rok = @dataMOD) THEN
  9. PREPARE s1 FROM @sql;
  10. EXECUTE s1;
  11. END IF;
  12. END//
  13. DELIMITER ;


Wszelka pomoc/sugestie mile widzane (IMG:style_emoticons/default/smile.gif)
(ps. proszę tylko o nie komentowania tego rozwiązania w stylu - "tak się nie robi, że tabela ma nazwe wyniki_2012, wyniki_2013.." bo ja o tym wiem.. ale to jest jak już wspominałem bardziej udowodnienie tego "że się da".

Ten post edytował mikajlo 15.12.2012, 15:34:03
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 03:10