当我试图创建这个散列密码的过程时,我不断得到一个语法错误。不知道为什么它说有语法错误。
我经常遇到的错误是:
sql语法有错误;在第2行的“@pfirstname varchar(255)、@plastname varchar(255)、@pemail varchar(255)、@”附近,检查与您的mysql服务器版本相对应的手册,以获得正确的语法
CREATE PROCEDURE `Users`
@pFirstName varchar(255),
@pLastName varchar(255),
@pEmail varchar(255),
@pPassword NVARCHAR(50),
@pType int(11),
@pCreatedAt datetime,
@pUpdatedAt datetime,
@pUser_type enum('admin','project-manager','lawyer','anonymous-client','client','external-client','intake-bot'),
@pUndashPassword NVARCHAR(50),
@responseMessage NVARCHAR(250) OUTPUT
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
insert into `Users` (`firstName`,`lastName`,`email`, `password`,`type`,`createdAt`,`updatedAt`,`user_type`, `PasswordHash`)
VALUES(@pFirstName, @pLastName, @pEmail, @pPassword, @pType, @pCreatedAt, @pUpdatedAt, @pUser_type, HASHBYTES('SHA2_512', @pUndashPassword))
SET @responseMessage='Success'
END TRY
BEGIN CATCH
SET @responseMessage=ERROR_MESSAGE()
END CATCH
END
2条答案
按热度按时间tnkciper1#
看起来您已经习惯了microsoft sql server语法。
mysql不是microsoftsqlserver的sql实现。mysql有自己的语法,这是不同的。我注意到您的示例中有很多东西在mysql中不起作用。我还没有测试你的程序,看看这是否是一个完整的列表,所以把它作为一个样本的错误。
mysql不使用
@
程序参数或局部变量的符号。请参阅我对mysql存储过程的回答,在执行时给出未知列错误TRY
/CATCH
是microsoft语法。mysql不使用这个,它使用一种语法来声明错误状态的“处理程序”:https://dev.mysql.com/doc/refman/8.0/en/declare-handler.htmlSET NOCOUNT ON
也是microsoft语法。mysql没有任何等效的特性。SHA_512()
不是mysql中的函数。你应该使用SHA2(<string>, 512)
. 看到了吗https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_sha2您应该阅读一些有关存储过程语法的mysql文档。
本手册仅供参考。所有的语法都有文档记录,但它不是面向任务的文档,因此仅从手册中学习mysql存储过程是很困难的。
https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html
https://dev.mysql.com/doc/refman/8.0/en/sql-compound-statements.html
还有一本o'reilly的书,现在已经有点旧了,但是毫无疑问仍然很有用,因为mysql存储过程的特性没有太大的改变:mysql存储过程编程。
xriantvc2#
当您在mysql中声明sp中使用的变量时,您需要这样做:
我是说你需要:
确定元素是否为
input
价值观outpu
价值或者两者兼有inputouput
变量的名称数据类型将存储在此变量中
现在这些是sp的参数,但如果您需要sp中的变量,则正确的sintax是:
我是说你需要:
DECLARE
固定变量的名称
将存储的数据类型
也可以设置
DEFAULT
价值检查这个例子
在你这样称呼它之后:
参考