2017-06-05 13 views
1

MySQlストアドプロシージャの新機能です。私は単純な準備のSELECTステートメントの実行と単一のINパラメータで簡単なプロシージャを作成しようとしています。 PREPAREの作成中にSELECT文でINパラメータを直接使用している場合、prepare文の実行時にINパラメータのUnknown列エラーがスローされます。MySQLストアドプロシージャ:selectステートメントのINパラメータでプリペアドステートメントを実行すると、 "Error Code:1054 Unknown column"が返されます

DELIMITER $$ 

DROP PROCEDURE IF EXISTS test_prep_stmt_two$$ 

CREATE PROCEDURE test_prep_stmt_two(IN user_id_in INT) 
BEGIN 
    #this line causing error 
    PREPARE param_stmt FROM "select * from users u where u.user_id=user_id_in"; 

    EXECUTE param_stmt; 

    DEALLOCATE PREPARE param_stmt; 


END $$ 

DELIMITER ; 

DELIMITER $$ 

Iコールtest_prep_stmt_two(1)のようなプロシージャを呼び出します。下にエラーが発生しています。

Error Code: 1054 
Unknown column 'user_id_in' in 'where clause' 

しかし、私はプロシージャ内で任意の変数にPARAM値で設定し、その中には、SELECT文を作成し使用している場合、それは正常に動作しています。以下の手順はうまくいきます。

DELIMITER $$ 

DROP PROCEDURE IF EXISTS test_prep_stmt_three$$ 

CREATE PROCEDURE test_prep_stmt_three(IN user_id_in INT) 
BEGIN 

    SET @user_id_in=user_id_in; 

    #this works fine 
    PREPARE set_stmt FROM "select * from users u where [email protected]_id_in"; 

    EXECUTE set_stmt; 

    DEALLOCATE PREPARE set_stmt; 

END $$ 

DELIMITER ; 

でエラーを投げselect文を準備し、パラメータIN使用して、なぜ、誰も私を説明することができます。

答えて

3
DELIMITER $$ 

DROP PROCEDURE IF EXISTS test_prep_stmt_two$$ 

CREATE PROCEDURE test_prep_stmt_two(IN user_id_in INT) 
BEGIN 

SET @t1 =CONCAT("select * from users u where u.user_id= '",user_id_in,"'"); 
PREPARE param_stmt FROM @t1; 
EXECUTE param_stmt; 
DEALLOCATE PREPARE param_stmt; 


END $$ 

DELIMITER ; 

DELIMITER $$ 

上記のコードを試してください。

これが役に立ちます。

+0

ありがとう@Sagar Gangwal。ありがとうございます。 INパラメータで動作しない理由と、SETまたはconcatで動作する理由を説明してください。 – mady

+0

@ mady動的クエリを作成する必要があります。あなたが直接二重引用符を入れてmysqlエンジンがこれは全体のクエリであり、それを実行しようとしていることを理解してください。しかし、私はその変数を入れていたとconcatを使用して動的クエリを行う。 –

関連する問題