[MySQL] błąd procedury

0

Mam procedurę:

CREATE PROCEDURE addusr(IN log VARCHAR(32),IN pas VARCHAR(32),IN nam VARCHAR(32),IN adr VARCHAR(256))
BEGIN
DECLARE curid INT;
SET curid=(SELECT TOP 1 id_user FROM uzytkownik ORDER BY id_user DESC) +1;
IF curid IS NULL THEN SET curid=0;
END IF;
INSERT INTO uzytkownik (id_user,login,pass,name,mail,last_login)
VALUES (curid,log,pas,nam,adr,null);
END

Niestety MySQL nie chce jej przyjąć :/. Wynik wykonania:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3 

Ja niestety nie widzę błędów... Ta funkcja jest przeniesiona z Sybase SQL Anywhere 10, gdzie oczywiście działa idealnie.

0

jaka wersja mysqla?

btw za takie coś powinno być zwolnienie z roboty z naganą ...

SET curid=(SELECT TOP 1 id_user FROM uzytkownik ORDER BY id_user DESC) +1;
IF curid IS NULL THEN SET curid=0;
END IF;
0

wersja: 5.0.51a-9+lenny2-log

Zwolnienie z naganą? Nie rozumiem...

0

A auto_increment rozumiesz?

0

aaa... owszem, rozumiem... nie wydaje mi sie, aby robiło to wielką różnicę. Działa tak samo. Z resztą w pewnym sensie potrzebuję, aby id zaczynały się od 0, a nie od 1.

Ważniejsze jest czemu mysql nie chce mi tej procedury przyjąć...

Odnośnie auto_increment to jeszcze mogę to poprawić, mam na to chwilę.

0

Robi czy nie dodajesz sobie tylko pracy. ID nie powinno miec dodatkowych uwarunkowan typu 'ma sie zaczynac od 0'. Ma identyfikowac kazdy wiersz i tak wlasnie dziala.

A zmieniles delimiter na czas deklaracji procedury?

0
eloar napisał(a)

aaa... owszem, rozumiem... nie wydaje mi sie, aby robiło to wielką różnicę. Działa tak samo.
a pomyślałeś może co będzie jak z dwóch stanowik zostanie wywołana ta procedura :>

DELIMITER $$
CREATE PROCEDURE xxx()
BEGIN

END $$

DELIMITER ;
0

Co do użycia DELIMITER to znalazłem to w końcu na google i zastosowałem, ale i tak uzyskałem błędy. A wszystko było przez użycie TOP (czy tam FIRST), których MySQL nie uznaje.

O ile mi się wydaje, to z przetwarzania transakcyjnego wyjdzie, że i tak uzyska się takie same wyniki. Dopóki jeden SELECT się nie zakończy, to drugi się nie zacznie, a poza tym, INSERT zacznie się na tyle "szybko", że nie ma zbyt wielkich szans na wciśnięcie między nie następnego selecta....

Wiem, że nieco się mylę, ponieważ szansa istnieje i zgodnie z prawem Marphiego to się właśnie kiedyś stanie. Przerobię nieco bazę i postaram się o pola auto_increment. Szkoda tylko, że przy okazji musze przerobić nieco obiektów i takich tam, bo znikną pola z id 0. To było dość istotne wbrew pozorom.

Dzięki za krytykę, przyda się jak zawsze.

0
  1. jeśli wartość 0 jest istotna to przypuszczam, że może być tak, że zmienia się rekord, który je ma a to już jest niebezpieczne
  2. wbrew pozorom bardzo łatwo jest wywołać tą procedurę tak, aby dostać dwa razy to samo id - zauważ, że nie commitujesz zmian w procedurze a poza nią (najprawdopodobniej w programie). Dopóki nowy rekord nie zostanie zacommitowany (ale brzydkie spolszczenie :/) to każdy odczyt max(id) zwróci Ci to samo. autoinc nie ma takiego problemu - KAŻDE odczytanie nowej wartości id zwiększa licznik o 1, niezależnie od transakcji.

To, że do tej pory nigdzie Ci to nie wyleciało oznacza, że miałeś szczęście lub nikt nie pracował z programem na więcej niż jednym stanowisku

co do błędu to jest LIMIT, ale pewnie to już znalazłeś.
PS. phpmyadmin pokazał błąd trochę w nie tej linii
ps2. czemu select top 1 zamiast po prostu select max() ? max na kolumnie z indeksem nie daje rady w sybase?

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