在sequel pro中编写散列密码的过程时语法错误

oknwwptz  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(415)

当我试图创建这个散列密码的过程时,我不断得到一个语法错误。不知道为什么它说有语法错误。
我经常遇到的错误是:
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
tnkciper

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.html SET 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存储过程编程。

xriantvc

xriantvc2#

当您在mysql中声明sp中使用的变量时,您需要这样做:

STORE PROCEDURE someThing(in Var1 INT, in Var2 VARCHAR(20)....)

我是说你需要:
确定元素是否为 input 价值观 outpu 价值或者两者兼有 inputouput 变量的名称
数据类型将存储在此变量中
现在这些是sp的参数,但如果您需要sp中的变量,则正确的sintax是:

DECLARE anotherValue INT DEFAULT 10;

我是说你需要: DECLARE 固定
变量的名称
将存储的数据类型
也可以设置 DEFAULT 价值
检查这个例子

DELIMITER //
CREATE PROCEDURE EXAMPLE1(IN idUser INT)
BEGIN
    DECLARE Total INT;
    SELECT COUNT(*)
    INTO Total 
    FROM users 
    WHERE users.id = idUser;
    SELECT Total;
END //
DELIMITER ;

在你这样称呼它之后:

CALL EXAMPLE1(1);

参考

相关问题