Mysql stored procedure update hiba

Mysql stored procedure update hiba
2009-07-29T10:11:07+02:00
2009-07-30T16:02:34+02:00
2022-11-14T11:15:35+01:00
babo_
Sziasztok!

MySQL-ben készítettem egy tárolt eljárást.
A hibás része az alábbi:
UPDATE tbl_pack SET NextSerial=SerialValue WHERE LabelID=_LabelID AND Closed IS NULL; COMMIT; SELECT * FROM tbl_pack WHERE LabelID=_LabelID AND Closed IS NULL;
Hibátlanul le is fut, azonban az update utáni select nem a módosított tábla rekordjait hozza, hanem a korábbit. (A commit-ot utólag tettem bele).
Nekem viszont az kellene, hogy a tárolt eljárás az újonnan megmódosult rekordot adja vissza.
Mivel szintaktikailag helyes a kód (működik), nem tudom, hogy mi okozhatja a problémát, emiatt a google-ban se tudok igazán rákeresni.
Valaki találkozott már a problémával?
Mutasd a teljes hozzászólást!
Na megtaláltam a hibát.
Ha egy tárolt eljárásban több select is ki van adva, akkor az elsőnek kiadott select fog megjelenni eredményként.
Én meg pont olyan peches voltam, hogy az elsőnek kiadott selectem és az utolsónak kiadott select megegyezett, csak ugye közte volt az update.
Mutasd a teljes hozzászólást!

  • Meg kellene kérdezni valahogy, hogy az UPDATE hány rekordot érintett (mint az sqlca.sqlerrd[2] embebbed SQL-ben).
    Mutasd a teljes hozzászólást!
  • (A commit-ot utólag tettem bele).

    és van benne
    START TRANSACTION;
    is?
    Példa..(MySQL Stored Procedure - UPDATE - Example)

    Példa..(START TRANSACTION, COMMIT, and ROLLBACK Syntax)
    Mutasd a teljes hozzászólást!
  • Nincs igazából tranzakció kezelés, és garantáltan 1 rekordot érint az update.
    A commit-ot utólagosan tettem be, mert anélkül is ez volt a jelenség, reméltem, hogy ez megoldja.
    Mutasd a teljes hozzászólást!
  • Valójában az update lefut, de az utánajövő select még a módosítatlan rekordot hozza.
    Ha azonban utána kiadok egy selectet mondjuk a HeidiSQL-ből, akkor az helyesen hozza a módosított rekordot.
    Nekem viszont arra lenne szükségem, hogy a tárolt eljárás is már a módosított rekordot adja vissza
    Mutasd a teljes hozzászólást!
  • Na megtaláltam a hibát.
    Ha egy tárolt eljárásban több select is ki van adva, akkor az elsőnek kiadott select fog megjelenni eredményként.
    Én meg pont olyan peches voltam, hogy az elsőnek kiadott selectem és az utolsónak kiadott select megegyezett, csak ugye közte volt az update.
    Mutasd a teljes hozzászólást!
  • Ha egy tárolt eljárásban több select is ki van adva, akkor az elsőnek kiadott select fog megjelenni eredményként.

    Bocsi, de ebben kételkedem..
    Megmutatnád azt a tárolt eljárást?
    Mutasd a teljes hozzászólást!
  • Sajna már javítottam, de valami ilyesmi volt:

    CALL tarolteljaras(parameter); //ez visszatér egy sorral UPDATE ... SELECT ...

    A
    tarolteljaras
    nevű eljárás létrehozott egy rekordot ha nem létezett majd visszatért egy rekorddal.
    Ezután ezt a rekordot az UPDATE megmódosította, majd a SELECT-nek vissza kellett volna adnia a módosított rekordot. Ehelyett a
    tarolteljaras
    által visszaadott rekordot adta vissza (de az UPDATE lefutott, mert ellenőriztem).
    Úgy javítottam a dolgot, hogy a
    tarolteljaras
    -ban definiált feltételes INSERT-et átemeltem ide (kihagytam belőle a SELECT részt), és így már rendesen működött.
    Mutasd a teljes hozzászólást!
  • Bocsi, de a kettő nem ugyanaz:
    1.
    Ha egy tárolt eljárásban több select is ki van adva, akkor az elsőnek kiadott select fog megjelenni eredményként.


    2.
    A tarolteljaras nevű eljárás létrehozott egy rekordot ha nem létezett majd visszatért egy rekorddal.
    Ezután ezt a rekordot az UPDATE megmódosította, majd a SELECT-nek vissza kellett volna adnia a módosított rekordot. Ehelyett a tarolteljaras által visszaadott rekordot adta vissza (de az UPDATE lefutott, mert ellenőriztem).


    Én az elsőben kételkedtem, a másodikat nem is említem, mert mintha belezavarodtál volna.
    Vagyis egy tárolt eljárásban lefut egy select, majd lefut egy update azonos sorokra, akkor a következő select nem adhat az azonos sorokra update előtti tartalmat.
    Mutasd a teljes hozzászólást!
  • Na akkor mégegyszer:
    adott 2 db tárolt eljárás:
    1. Ellenőrzi, hogy létezik-e egy bizonyos feltételnek megfelelő rekord. Ha nem akkor létrehozza, majd MINDEN ESETBEN visszatér a rekorddal (azaz vagy az újonnan létrehozottal, vagy a létezővel)
    A 2. tárolt eljárás:
    a, meghívja az egyest
    b, update-eli a rekordot
    c, visszatér(ne) a módosított rekorddal.

    Na most az így elkészített 2.-es tárolt eljárás meghívás után ugyan elvégezte az update-t, de a c pontban kiadott select vagy nem futott le, és az a,-ban kiadott tárolt eljárás értékét adta vissza, vagy lefutott, de akkor az update előtti állapottal tért vissza.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd