2016-04-25 5 views
0

ご理解ください、 dbに新しいユーザーを作成するためのストアドプロシージャを作成する必要があります。 newname/null 私は間違って行くのです。ここで私call add_user('peter'); それは私を示しmysqlはNULLを返します。

delimiter //  
    CREATE PROCEDURE add_user (x VARCHAR(25)) 
    BEGIN 
     DECLARE x VARCHAR(25) DEFAULT 'mark'; 
     DECLARE newname VARCHAR(25); 
     DECLARE xid INT; 

     SELECT x, id INTO newname, xid 
     FROM users WHERE x = x; 
     SELECT newname; 
    END; 
    delimiter ; 

+0

「WHERE xname = xname'? – axiac

+0

私の悪い、申し訳ありません、 'xname to x' – 100vla

答えて

1
CREATE PROCEDURE add_user (x VARCHAR(25)) 
BEGIN 
    DECLARE x VARCHAR(25) DEFAULT 'mark'; 

これは実際にxという名前の変数を作成します。 1つ目は関数のパラメータで、2つ目はBEGIN ... ENDブロックのスコープ内にあるローカル変数です。 MySQLのscoping rulesによれば、これらの変数のうち1つのみが表示される可能性があります。つまり、xというパラメータは、BEGIN ... ENDブロック内に隠れてアクセスできません。

ソリューションを使用すると、デフォルト値を割り当てる必要がある場合、IFブロックでそれを行う、ラインに

DECLARE x VARCHAR(25) DEFAULT 'mark'; 

を削除するだけです:

IF x IS NULL THEN 
    SET x = 'mark'; 
END IF; 

完全な関数定義をする必要があります

delimiter //  
CREATE PROCEDURE add_user (x VARCHAR(25)) 
BEGIN 
    DECLARE newname VARCHAR(25); 
    DECLARE xid INT; 

    IF x IS NULL THEN 
    SET x = 'mark'; 
    END IF; 

    SELECT x, id INTO newname, xid 
    FROM users WHERE x = x; 
    SELECT newname; 
END; 
delimiter ; 
+0

ありがとう@ダーウィンフォンCorax、本当に、ありがとう! – 100vla

関連する問題