0

以下は、ユーザー名(入力)を持つユーザーがデータベースに存在するかどうかを確認するためのストアド プロシージャ(ルーチン)です。データベース内には、ユーザー名が「dev」のユーザーが既にいます。 ただし、以下のルーチンを実行すると、res = 1が返されました。これは -1であると予想していました

このようにルーチンを呼び出しました。私が間違った方法で呼んでいる場合は、私も修正してください。私はMySQLルーチンに本当に慣れていません。

CALL usp_GetUserValidation ('dev', @ErrorCode)

ここにMySQL Routineのプロがいて、これについて教えてくれますか? よろしくお願いします:)

DELIMITER $$
CREATE PROCEDURE usp_GetUserValidation(IN `@Username` VARCHAR(255), OUT `@ErrorCode` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT 'To validate user login'
BEGIN

    IF EXISTS
    (SELECT UserID 
        FROM mt_User
        WHERE UserName = @Username)
    THEN
            SET @ErrorCode = -1;


    ELSE
        SET @ErrorCode =  1;

    END IF;


    SELECT @ErrorCode AS res;

END$$
DELIMITER ;
4

1 に答える 1

2

これは、パラメーターの命名規則にすぎません。@それは厄介で、それらのユーザー変数記号が好きではありません。

OUT情報と変数の両方を含む結果セットを返しているので、あなたは私が見ることができるテストです。

drop procedure if exists usp_GetUserValidation;
DELIMITER $$
CREATE PROCEDURE usp_GetUserValidation(IN pUsername VARCHAR(255), OUT pErrorCode INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT 'To validate user login'
BEGIN

    IF EXISTS
    (SELECT UserID 
        FROM mt_User
        WHERE UserName = pUsername)
    THEN
            SET pErrorCode = -1;
    ELSE
        SET pErrorCode =  1;
    END IF;


    SELECT pErrorCode AS res;

END$$
DELIMITER ;

スキーマ:

-- drop table if exists mt_user;
create table mt_User 
(   UserID int auto_increment primary key,
    UserName varchar(100) not null,
    unique key(UserName)
);

insert mt_User(UserName) values ('dev');
select * from mt_User;

テスト:

set @var1:=-4;
call usp_GetUserValidation('dev',@var1);
-- returns (-1) ---- Yea, we like that
select @var1;
-- (-1)

set @var1:=-4;
call usp_GetUserValidation('dev222',@var1);
-- returns 1 ---- Yea, we like that
select @var1;
-- 1
于 2016-06-26T17:27:49.357 に答える