2016-12-05 7 views
0

私はMySQLには新しく、簡単な手順を作成しようとしています。このプロシージャは、列名である引数を受け取り、引数として渡された列によって行が順序付けされている表を戻す必要があります。mysqlで手続きを正しく作成するには?

delimiter // 
CREATE PROCEDURE OrderMyTableBy (ColumnName varchar(45)) 
    BEGIN 
     SELECT * 
     FROM items 
     ORDER BY ColumnName; 
    END;// 
delimiter ; 

手順が正常に作成されます。ここでは

は、私がこれまでに書いたものです。次のように

その後、私はそれを呼び出す:

CALL OrderMyTableBy('price') 

私は価格で注文した行せずにテーブルを取得していますその結果。私はこのクエリのために得る普通のテーブルを持っています:SELECT * FROM items。だから基本的には、ColumnNameは無視されるようです。

注:CALL OrderMyTableBy(helloworld):私は手順この方法を呼び出す場合。このエラーが発生します:

Error Code: 1054. Unknown column 'helloworld' in 'field list'

私の質問は明らかでした。詳細が必要な場合は下記にコメントしてください。 ありがとう!

+0

Mybeは助けることができますhttp://dev.mysql.com/doc/refman/5.7/en/create-procedure.html – Sami

答えて

0

コード入力がこの回答では動作しませんでした何らかの理由で申し訳ありません。

は最後に、私はそれを行う方法を見つけた:

手順を作成する2通りの方法があります。

  1. が正しい方法は、(スキーマでの左ペインで)ストアドプロシージャを開くことですそこに私が質問で提供した構文で "デリミタ"行を使わずに作成してください。

    CREATE PROCEDURE OrderByColName (IN col VARCHAR(20))

    BEGIN

    SET @sql = CONCAT('SELECT * FROM items ORDER BY ', col, ' ASC');

    PREPARE stmt FROM @sql;

    EXECUTE stmt;

    DEALLOCATE PREPARE stmt;

    END

  2. もう一つの方法は、(私は以前試した)クエリ]タブで行うことです。ここでは、この構文を使用する必要があります。

delimiter //

CREATE DEFINER=ルート@ localhostのPROCEDURE OrderByColName (IN col VARCHAR(20))

BEGIN

SET @sql = CONCAT('SELECT * FROM items ORDER BY ', col, ' ASC');

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

END

// delimiter ;

それがお役に立てば幸いです。もう一度申し訳ありませんコード入力が機能しませんでした

0

これを試してみてください:

CREATE PROCEDURE OrderMyTableBy (ColumnName varchar(45)) 
BEGIN 
     SET @t1 = CONCAT("SELECT * FROM items ORDER BY ", ColumnName); 
     PREPARE stmt FROM @t1; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt 
END; 

あなたは動的問合せを行い、その後、ストアドプロシージャを呼び出す必要があります。

+0

私はこのコードをテストし、 OPのものとまったく同じです – Thielicious

+0

@TungFam私とあなたの答えの違いは何ですか? –

関連する問題