Procedure Loop Insert lefut, de invalid condition number hibát dob
2022-05-25T09:48:31+02:00
2022-05-26T15:42:40+02:00
2022-06-29T08:07:39+02:00
madigabi
Sziasztok,

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

Előre is köszönöm a válaszokat!
Mutasd a teljes hozzászólást!

  • Esetleg a GET DIAGNOSTICS 1 mögé nem kellene egy  ";" ?


    Ui: más... Biztos, hogy a prepare-t jól használod? Azt nem csak egyszer, a cikluson kívül kell végrehajtani és az execute-ban felparaméterezni?
    Mutasd a teljes hozzászólást!
  • De legalább most is tanultam valamit. Nem kell, az ott még folytatódik.
    (a nálam elsőként előbukkanó google találatban valamiért úgy szerepelt.)
    Mutasd a teljes hozzászólást!
  • 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.
    Mutasd a teljes hozzászólást!
  • Semmi köze a GET DIAGNOSTICS használatához ennek a hibának. 
    A hibakijelzést a SHOW WARNINGS adja.

    Nagyon köszönöm a tanácsokat, a pontosvesszőtől a mysql használatáig.

    A pontosvessző használata a GET DIAGNOSTICS után egyébiránt szintaktikailag hibás.
    Mutasd a teljes hozzászólást!
  • 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.
    Mutasd a teljes hozzászólást!
  • 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".
    Mutasd a teljes hozzászólást!
abcd