webForumDet fria alternativet

MySql, Stored Procedure

10 svar · 1 483 visningar · startad av DavidB

DavidBMedlem sedan jan. 20001 140 inlägg
#1

Tjena

Försöker mig på att göra några Stored Procedures i MySql men får inte riktigt till det som jag vill ha det.

Funktionen är att jag vill lägga in data i databasen, sen hämta ut det ID på den rad som skapades och sedan lägga in ytteligare en rad där detta ID används utan att det skall returnera någonting

declare [b]insertId[/b] Int;

INSERT Into users (username,password,email)
            values(UserName,Password,Email);

SELECT last_insert_id() INTO [b]insertId[/b] from users;

INSERT Into users_events (user_id,datetime,ip)
                   values([b]insertId[/b],DateTime,IP);

Vet inte ens om jag är rätt ute, jag får följande fel:
#42000Result consisted of more than one row

Nån som har en ide?

CompusaMedlem sedan jan. 20022 952 inlägg
#2

JFGI ;)

When using INTO variables, it must return exactly one row, but apparently it does not. Either make the WHERE select a unique row,
or use LIMIT 1 to enforce a single result (which assumes that you want the first one).

DavidBMedlem sedan jan. 20001 140 inlägg
#3

Fungerade utmärkt, tack!

LarsGMedlem sedan dec. 200012 465 inlägg
#4

Du behöver inte blanda in select into och någon tabell

SET insertId = last_insert_id();
DavidBMedlem sedan jan. 20001 140 inlägg
#5

Tackar, gav lite mindre kod.

Har stött på ett annat problem, får inte IF-satsen att fungera.

  declare UserId int;
  declare Comment varchar(45);

  select id from users where username = Usr AND password = Pwd;
  set UserId = id;

  if UserId > 0 then
    Comment = 'sadsad';
  else
    Comment = 'saddsa';
  end if;
DavidBMedlem sedan jan. 20001 140 inlägg
#6
  declare UserId int;
  declare Comment varchar(45);

  select id from users where username = Usr AND password = Pwd;
  set UserId = id;

  if UserId > 0 then
    [b]SET[/b] Comment = 'sadsad';
  else
    [b]SET[/b] Comment = 'saddsa';
  end if;

:OO

LarsGMedlem sedan dec. 200012 465 inlägg
#7
if  exists (select * from users where username = Usr AND password = Pwd) then
    SET Comment = 'sadsad';
else
    SET Comment = 'saddsa';
end if;

eller vad är problemet?

Peter SMedlem sedan dec. 20025 484 inlägg
#8

Skulle gissa på att David i inlägg #5 glömde 'SET' i if-satsen.

:)

LarsGMedlem sedan dec. 200012 465 inlägg
#9

Jo, men jag förstår inte hur

select id from users where username = Usr AND password = Pwd;
set UserId = id;

skulle fungera.

DavidBMedlem sedan jan. 20001 140 inlägg
#10

LarsG:
Du har helt rätt. Det fungerade inte, fick inte tid att testa igår.

Problem återstår, det jag vill är att ID't på användaren skall sparas i UserId för att sedan användas
i en INSERT i en annan tabell.

Dessutom vill jag att UserId skall "returneras" till min applikation, hur gör jag detta?

Bifogar hela proceduren:

DELIMITER $$

DROP PROCEDURE IF EXISTS `db`.`ValidateUser` $$
CREATE PROCEDURE `ValidateUser`(IN UserName varchar(45),
				IN Pass varchar(45),
				IN IP varchar(14),
				IN DateTime DateTime)
BEGIN
	declare UserId int;
	declare Comment varchar(45);

	select id from users where username = UserName AND password = Pass limit 1;
	SET UserId = id;

	if UserId > 0 then
		SET Comment = 'Success';
	else
		SET Comment = 'Failure';
	end if;

	insert into events (user_id,datetime,ip,comment)
	values(UserId,DateTime,IP,Comment);
END $$

DELIMITER ;
LarsGMedlem sedan dec. 200012 465 inlägg
#11
declare UserId int;
select id into userid from users where username = UserName AND password = Pass;
if  userid is null then
-- ingen användare med detta namn finns, vidtag lämplig åtgärd
else
-- användare funnen 
end if;
364 ms totalt · 5 externa anrop · cache AV · v20260730165559-full.0b955084
0 ms — hämta statistik (cache)
119 ms — slå upp tråd (db)
0 ms — hämta forumlista (cache)
122 ms — hämta inlägg (db)
120 ms — hämta bilagor (db)