Tárolt eljárással a sorokban lévő adatokat oszlopokba rendezem.
(A mypivot táblában a paraméternevek oszlopokként szerepelnek 'Name: '+ előtaggal)
A táblába rendben beillesztésre kerülnek az adatok megfelelően, de Invalid condition number (1758) hiba jelenik meg minden rekordra a beillesztés után.
Tudja valaki mi okozhatja ezt a hibát?
BEGIN
DECLARE C varchar(45);
DECLARE P varchar(200);
DECLARE V varchar(200);
DECLARE DONE BOOLEAN;
DECLARE CURLP CURSOR FOR
SELECT `id`, `param_name`, `param_value` FROM mytable; --
--
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE;
SET NAMES UTF8;
OPEN CURLP;
read_loop: LOOP
BEGIN
FETCH CURLP INTO C, P, V;
IF DONE THEN
LEAVE read_loop;
END IF;
SET @QRY = CONCAT ("INSERT INTO \r\n mypivot\r\n (`id`, `Name: ", P, "`) \r\n VALUES ('", C, "', '", V, "') \r\n ON DUPLICATE KEY UPDATE \r\n `Name: ", P, "` = '", V, "';");
--
PREPARE stmt1 FROM @QRY;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
--
GET DIAGNOSTICS CONDITION 1
--
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
--
SELECT @p1 as RETURNED_SQLSTATE , @p2 as MESSAGE_TEXT;
--
ROLLBACK;
SHOW WARNINGS;
END;
END LOOP;
CLOSE CURLP;
END
Amennyire megértettem a problémádat és a mysql működését, mindössze annyi a történet, hogy ha nincs hiba, nincs diagnosztika, ebből következően a GET DIAGNOSTICS hibát produkál.
Azért kapod az insertek után folyamatosan a 1758-at, mert az insert hiba nélkül lefutott.
Megoldás: a GET DIAGNOSTICS használatát áttenni valami hibakezelő részbe (gondolom, tud ilyet a mysql).
De azt továbbra is fenntartom, amit egy másik nickednek írtam: erre ne használj RDBMS-t, nem erre találták ki. Vannak funkciói arra, hogy oszlop értéke alapján csoportosítsd a sorokat és azt a megjelenítéskor formázd.
De van. A show warnings az utolsó hibá(ka)t mutatja.
Mivel az insert utánig nincs hiba, nincs mit kiolvasnia a get diagnostics parancsnak.
A hiba (mariadb doksiban találtam meg) pontosan azt jelenti, hogy hibás sorszámot kapott.
Próbáld ki parancssorból, hogy inditás után beirsz egy ilyet:
GET DIAGNOSTICS CONDITION 1 @vv=RETURNED_SQLSTATE;
SHOW WARNINGS;
Kapásból ez a hiba jön.
Utána egy rollback vagy commit, majd újabb show warnings már nem jelez hibát.
Ha megint megpróbálod, újra előjön.
De... Ha beküldesz egy hibás parancsot és utána futtatod a get diag ... show warnings parancsokat, már csak az utolsó egy vagy több hiba fog megjelenni.
Esetleg vedd ki a GET DIAGNOSTICS ...; -t és csak a show warnings maradjon! Abból elég gyorsan kiderül, hogy mi a helyzet.
Nálam ez történt: kivettem, megszűnt a "hiba".