对于类赋值,我需要将记录从Checked_Out_Media表移动到History表,其中表是相同的。然后我需要从Checked_Out_Media表中删除记录。我已经把它归结为:
Create Procedure spMoveToHistory( IN in_UserID char(6), IN in_MediaBarcode char(3) )
BEGIN
SELECT @NextRow := (MAX(History_TUID) + 1)
From History;
Insert into History
Select @NextRow, COM.User_ID, COM.Media_Barcode,
COM.Checked_Out_Date, COM.Return_Date
From Checked_Out_Media COM
Where COM.User_ID = in_UserID AND
COM.Media_Barcode = in_MediaBarcode;
END;
上面的代码似乎完全正常,直到我运行它。它没有做任何事情,无论好坏。当我在创建过程后检查过程时,它显示End语句中有错误。我不确定为什么只会在我创建之后出现...无论哪种方式,我都希望有人可以澄清为什么上面的内容不起作用所以我可以尝试添加下面的代码。 此外,这篇文章的主要原因是要问:是否有可能在程序中实施多个交易?
Delete From checked_out_media
Where User_ID = in_UserID AND Media_Barcode = in_MediaBarcode;
答案 0 :(得分:0)
存储过程的问题在于命令如何相互分离。正如defining stored programs上的mysql文档所说:
如果使用mysql客户端程序来定义存储的程序 包含分号字符,出现问题。默认情况下,mysql 它本身将分号识别为语句分隔符,因此您必须这样做 暂时重新定义分隔符以使mysql传递整个分隔符 存储的程序定义到服务器。
要重新定义mysql分隔符,请使用delimiter命令。该 以下示例显示了如何为dorepeat()过程执行此操作 刚刚显示。分隔符更改为//以启用整个分隔符 定义要作为单个语句传递给服务器,然后 恢复到;在调用该过程之前。这使得; 在程序体中使用的分隔符将被传递给 服务器,而不是由mysql本身解释。
mysql> delimiter // mysql> CREATE PROCEDURE dorepeat(p1 INT) -> BEGIN -> SET @x = 0; -> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
关于你的第二个问题:你没有在你的存储过程中执行任何事务,你的问题是你是否可以在存储过程中执行多个sql命令。答案是肯定的,您可以执行多个sql命令,参见上面的示例代码。
实际上,您可能需要考虑将插入和删除包含在单个事务中,但这是一个不同的问题。