Portál AbcLinuxu, 14. května 2025 05:36
Tak tu mam jeden dotaz, kde absolutne nechapu proc nefunguje, resp vim kde je chyba, ale nevim proc :))
Hned na prvnim SELECTu se vrati vzdycky 0, pritom v one tabulce 100% pozadovany zaznam existuje V podstate to dela to ze to uklada nazvy a jejich odvozene zkratky do tabulky. Pokud je nova zkratka jiz v tabulce, tak se za ni doplni cislo. Uz nad tim sedim hodinu.DELIMITER //
CREATE PROCEDURE VLOZIT_PREDMET(
nazev CHAR(255),
OUT id INT
)
BEGIN
DECLARE zkr, zkr_n CHAR(6);
DECLARE nalezeno BOOL;
DECLARE tmp INT DEFAULT 1;
SET zkr=LEFT(LOWER(nazev),3);
SET zkr_n=zkr;
SELECT COUNT(ID)>0 INTO nalezeno FROM predmety WHERE ZKRATKA=zkr LIMIT 1;
WHILE nalezeno=1 DO
SET zkr_n=CONCAT(zkr,tmp);
SELECT COUNT(ID)>0 INTO nalezeno
FROM predmety
WHERE ZKRATKA=zkr_n LIMIT 1;
SET tmp=tmp+1;
END WHILE;
INSERT INTO predmety (PREDMET, ZKRATKA)
VALUES(nazev, zkr_n);
SET id=LAST_INSERT_ID();
END//
DELIMITER ;
Řešení dotazu:
COUNT(ID)>0
pouzit SIGN(COUNT(ID))
?
2) trochu mi unika smysl tohoto reseni, je na to potreba cyklus?
Chapu to tak, ze se do tabulky predmety ma vlozit nejblizsi volna zkratka pro dany nazev. Chapu to spravne?
INSERT INTO predmety ( predmet , zkratka ) SELECT nazev , CONCAT(LEFT(LOWER(nazev), 3), COUNT(0) + 1) FROM predmety WHERE predmet = nazev GROUP BY predmet ;
INSERT INTO predmety ( predmet , zkratka ) SELECT nazev , CONCAT( LEFT(LOWER(nazev), 3) , ( SELECT COUNT(0) + 1 FROM predmety WHERE predmet = nazev ) ) ;PS: to + 1 tam byt nemusi, chces-li cislovat od nuly
SELECT COUNT(ID)>0 INTO nalezeno FROM predmety WHERE ZKRATKA=zkr LIMIT 1;
Pokud si tentyz prikaz pustim v konzoli, dela co ma, ale v tehle procedure ne. Ted jsem na to narazil podruhe a uz nad tim sedim X hodin a stale to nemohu vyresit. Znovu opakuji - ten statement jinak vraci hodnotu, ale v tomhle pripade nic, nalezeno je NULL. Fakt nevim co s tim uz.
Tohle je tentyz pripad:
SET nalezeno=(SELECT COUNT(ID)>0 FROM predmety WHERE ZKRATKA=zkr LIMIT 1)
SELECT ID INTO nalezeno FROM predmety LIMIT 1;
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.