Problem z procedurą MySQL

0

Mam następujący problem przy konstruowaniu procedury..

Wygląda ona na razie tak:

 
DELIMITER //
CREATE PROCEDURE addWynik_addOplata(
  idZ CHAR(10), idKPZ CHAR(10), Wyn CHAR(10), ammo INT(10), jestWyn INT(1))
BEGIN
DECLARE oplata INT(10); 

START TRANSACTION;
   INSERT INTO wyniki_2012(idZawodnik, idKonPerZaw, wynik) VALUES (idZ, idKPZ, Wyn);

IF (jestWyn > 0) THEN
   IF (ammo > 0) THEN
      UPDATE oplatyzawody2012 SET amunicja =    ....    WHERE idZawodnik = idZ AND idKonPerZaw = idKPZ;
   END IF;
ELSE
   INSERT INTO oplatyzawody2012 (idZawodnik, idKonPerZaw, amunicja, udzial, oplata) VALUES(idZ, idKPZ, ammo, 1,  oplata);
END IF;
COMMIT;
END//
DELIMITER ;

W skrócie procedura ma działać tak:
-jesli jestWyn = 1 to ma wykonać pierwszy INSERT oraz UPDATE (bez kolejnego inserta)
-jesli jestWyn = 0 to ma wyknać pierwszy INSERT oraz drugi INSERT (bez update'u)

Z czym mam problem?
Przy UPDATE'cie chciałbym wcześniej sprawdzić czy przekazywany do procedury parametr ammo jest większy od 0 (w zasadzie czy jest równy 1), jeśli tak to ma inkrementować poprzednią wartość znajdującą się w kolumnie amunicja i wykonać update (zastanawiam się jak wcześniej mam wySELECTować tą wartość..)

I jeszcze proszę o zwrócenie uwagi, czy dobrze zrobiłem tego zagnieżdżonego IF'a..

0
IF (jestWyn > 0) AND (ammo > 0) THEN
      UPDATE oplatyzawody2012 SET amunicja =    amunicja + 1   WHERE idZawodnik = idZ AND idKonPerZaw = idKPZ;
ELSE

teraz jest dobrze

0

@Marcin.Miga - dzięki za pomoc w poprzedniej sprawie..

Teraz mam inny problem.. Mianowicie muszę do procedury przekazać nazwę tabeli jako zmienną..

Próbuje przerobić procedure która działała już dla nazwy tabeli nie będącą zmienną, ale teraz mam problem..
(zakomentowane linie są pozostałością z poprzedniej procedury..)

EDIT:
Problem rozwiązany... błąd składniowy w zapytaniu..

 
DELIMITER //
CREATE PROCEDURE addOplataZawody(
  IN idZ CHAR(10), IN idKPZ CHAR(10), IN ammo INT(10), IN jestWyn INT(1), IN OProk CHAR(20))
BEGIN
    SET @paramA = idZ;
    SET @paramB = idKPZ;
    SET @paramC = ammo;
START TRANSACTION;
IF (jestWyn > 0) AND (ammo > 0) THEN
      SET @sql = CONCAT('UPDATE ',Oprok,' SET amunicja = amunicja + 1, oplata =  oplata + 1  WHERE idZawodnik =? AND idKonkurencjiPerZawody =?'); 
      PREPARE s1 from @sql;
      EXECUTE s1 USING @paramA, @paramB;
      #DEALLOCATE PREPARE s1;

      #UPDATE OProk
      #SET amunicja =  amunicja + 1, oplata =  oplata + 1  
      #WHERE idZawodnik = idZ AND idKonkurencjiPerZawody = idKPZ;
ELSEIF (jestWyn > 0) THEN
      SET @sql = CONCAT('UPDATE ',Oprok,' SET oplata =  oplata + 1  WHERE idZawodnik =? AND idKonkurencjiPerZawody =?'); 
      PREPARE s1 from @sql;
      EXECUTE s1 USING @paramA, @paramB;
      #DEALLOCATE PREPARE s1;

      #UPDATE Oprok
      #SET oplata =  oplata + 1  
      #WHERE idZawodnik = idZ AND idKonkurencjiPerZawody = idKPZ;
ELSEIF (jestWyn = 0) THEN
      SET @sql = CONCAT('INSERT INTO ',Oprok,' (idZawodnik, idKonkurencjiPerZawody, amunicja, udzial, oplata) VALUES(?, ?, ?, 1,  1)'); 
      PREPARE s1 from @sql;
      EXECUTE s1 USING @paramA, @paramB, @paramC;
      #DEALLOCATE PREPARE s1;

      #INSERT INTO OProk (idZawodnik, idKonkurencjiPerZawody, amunicja, udzial, oplata) VALUES(idZ, idKPZ, ammo, 1,  1);  
END IF;
COMMIT;
END//
DELIMITER ;
0

Mając kolejny problem z procedurą, a nie chcąc tworzyć nowego wątku, piszę w starym..

Problem dotyczy tej procedury:

CALL insertUser('pawelek', '1qazxsw2','Jan','Kowalski','Morska 15a','Koszalin','[email protected]','77031800592');

DELIMITER //
CREATE PROCEDURE insertUser(
  IN user VARCHAR(50), IN pass CHAR(40), IN fName VARCHAR(50), IN lName VARCHAR(50), IN address VARCHAR(50), IN city VARCHAR(50), IN email VARCHAR(50), IN pesel CHAR(11))
BEGIN
    DECLARE myvar INT(50);
    SET @paramA = user;
    SET @paramB = pass;
    SET @paramC = fName;
    SET @paramD = lName;
    SET @paramE = address;
    SET @paramF = city;
    SET @paramG = email;
    SET @paramH = pesel;

START TRANSACTION;
   SET @sql = CONCAT('INSERT INTO persons(firstName, lastName, address, city, email, pesel) VALUES (?,?,?,?,?,?)');
   PREPARE s1 from @sql;
   EXECUTE s1 USING @paramC, @paramD, @paramE, @paramF, @paramG, @paramH;

   SELECT person_id INTO myvar FROM persons WHERE pesel=@paramH LIMIT 1;
   SET @retrive_person_id = myvar;

   SET @sql = CONCAT('INSERT INTO users(username, password, person_id) VALUES (?,?,?)');
   PREPARE s1 from @sql;
   EXECUTE s1 USING @paramA, @paramB, @retrive_person_id;
COMMIT;
END//
DELIMITER ;

Po krótce, jaką funkcje ma spełniać ta procedura: wstawić nową osobę do tabeli person, nastepnie pobrać nowododanej osoby person_id i wstawić wiersz do tabeli users z wartością person_id.

Pierwszy problem jaki się pojawił to: 'Result consisted of more than one row'. Z tego co doczytałem należy w takiej sytuacji dodać LIMIT 1 do zapytania z SELECTEM (co jest według mnie troche dziwne bo jak wykonuje to polecenie z poziomu zapytania to daje jeden wiersz..).

No ale nic.. kolejny problem jaki się pojawił przy wykonywaniu procedury to informacja, że próbuje wstawić wiesz z person_id który juz istnieje w bazie .. (to w sytuacji gdy chce dodac drugą osobe..).

Ogólnie wydaje mi się, że to polecenie: SELECT person_id INTO myvar FROM persons WHERE pesel=@paramH LIMIT 1; źle funkcjonuje i zawsze zczytuje person_id pierwszej osoby w tabeli.. a powinien wyszukac person_id osoby po konkretnym peselu..

Jak można rozwiązać ten problem ? Być może konstrukcja tej procedury nie powinna tak wyglądac..

0

SELECT person_id INTO myvar FROM persons WHERE pesel=@paramH LIMIT 1
to najczęstszy błąd.
Powinieneś skorzystać z LAST_INSERT_ID()
Co do powielania klucza, to powinieneś skorzystać bądź z REPLACE zamiast INSERT, bądź wykorzystać dodatkową klauzulę ON DUPLICATE KEY RTFM.

0

person ma taką liczbę mnogą, jak i człowiek. czy nazwałbyś tabelę "człowieki"?

1 użytkowników online, w tym zalogowanych: 0, gości: 1