[Hilfe] Mysql Procedure

07/23/2012 19:40 Mathias1000#1
Hallo Liebe Comm,
Ich Sitze Nun schon 2 tagen an meiner Mysql Procedure und finde den Fehler einfach nicht vielleicht kann ja mal , jemand drüber schauen ich denk mir schon ich hätte nin Brett am Kopf

Code:
Create PROCEDURE `Create_Guild` (IN pName VARCHAR(16), IN pPassword VARCHAR(12), IN pAllowGuildWar SMALLINT(1),IN pCreaterID INT(11),IN pCreateTime TIMESTAMP,OUT pID INT(11))
BEGIN
 
 SET pID = 0;
 
 IF EXISTS (SELECT Name FROM Guilds WHERE Name = pName)
 BEGIN
  SELECT -1;
  RETURN;
 END
 
 SET pID = SELECT FLOOR(1+RAND() * 2147483647)  AS RANDOM_INT;

 WHILE EXISTS (SELECT ID FROM Guilds WHERE ID = pID)
 BEGIN
  SET pID = SELECT FLOOR(1+RAND() * 2147483647)  AS RANDOM_INT;
 END

BEGIN
INSERT INTO `Guilds` (Name, Password, AllowGuildWar, CreaterID, CreateTime) 
VALUES (pName, pPassword, pAllowGuildWar, pCreaterID, pCreateTime);
END
BEGIN
INSERT INTO GuildAcademy (GuildID,Message) VALUES (pID,'');
END

END
ich werde für Sehr Dankbar :)

mfg mathias1000
07/23/2012 20:48 tnd0#2
Name ist ein reserviertes wort. das solltest du nicht als spaltenname verwenden.

Dann musst du noch ein THEN nach IF EXISTS( ... ) ergänzen, das gleiche weiter unter nach dem while, allerdings ein DO. was die schleife machen soll kann ich nicht ganz erahnen, sieht total schwachsinnig aus. wenn du eine einzigartige ID brauchst - dann mach doch einfach ne spalte mit nem unique key?

RETURN; darfst du in procedures nicht benutzen, eine procedure 'returned' ja nichts. select -1 hört sich auch merkwürdig an. ein IF hat auch keinen begin .. end block, nach dem if-statement kommen die anweisungen, dann ggf. ein else und am schluss "END IF;".

und je nach dem welche db-engine du benutzt und wie du 'pID' speicherst ist der wert zu groß, 2147483647 aka 2^31-1 ist schon das maximum für einen signed integer.

und ich könnte so noch drei-vier seiten lang weiter machen, mach ich aber nicht:
[Only registered and activated users can see links. Click Here To Register...]


Achja, und besorg dir einen mysql-standalone client mit query editor. dann siehst du auch was mysql alles nicht an deiner query passt. z.b. [Only registered and activated users can see links. Click Here To Register...]
07/28/2012 11:12 sava#3
Quote:
Originally Posted by tnd0 View Post
Name ist ein reserviertes wort. das solltest du nicht als spaltenname verwenden.
Gut ist es nicht aber mit Backticks wäre es dennoch kein Problem.
07/29/2012 19:28 Mathias1000#4
SO habs jeze Selber gelöst kann geclosed werden :)

LÖSUNG:
Code:
proc_label:BEGIN
IF EXISTS (SELECT GuildName FROM Guilds WHERE GuildName = pName)
	THEN
  SELECT -1;
	LEAVE proc_label;
	END IF;
WHILE EXISTS (SELECT ID FROM Guilds WHERE ID = pID) DO
SET pID = FLOOR(1+RAND() * 200000);
END WHILE;

START TRANSACTION;
INSERT INTO `Guilds` (GuildName, pPassword, AllowGuildWar, CreaterID, CreateTime) 
VALUES (pName, pPassword, pAllowGuildWar, pCreaterID, pCreateTime);
COMMIT;
IF @ROWCOUNT = 0 Then
   ROLLBACK;
   SELECT -2;
	LEAVE proc_label;
END IF;

START TRANSACTION;
INSERT INTO GuildAcademy (GuildID,Message) VALUES (pID,'');
COMMIT;
IF @ROWCOUNT = 0 Then
   ROLLBACK;
   SELECT -3;
 	LEAVE proc_label;
END IF;
END
mfg mathias1000
07/30/2012 23:55 MrSm!th#5
#moved