2017-01-20 3 views
0

私はMySQL 5.7のストアドプロシージャと役立つポップアップエディタを初めて使用しました。私は通常のSQLエディットボックスに入れたときに動作するクエリがありますが、ストアドプロシージャを作成しようとすると失敗します。私は@rank:[email protected]+1が問題だと思っていますが、もちろんMySQLはそれを絞り込むのにあまり役に立ちません。MySQL 5.7 phpadminとUbuntuによるストアドプロシージャの構文エラー16.04

ポイントは、フィールド(ccstr)でいくつかの行を並べ替えるだけで、Nを入力パラメータとしてアイテム#Nを選択するだけです。

これは、値をNに置き換え、直接SQLとして働くが、私がポップアップエディタを使用して試してみた、とのミックスとマッチのすべての種類は、私がそのような考えることができます3

SET @rank:=0; 
SELECT ccstr FROM 
(SELECT @rank:[email protected]+1 AS rank, ccstr 
    FROM cards 
    ORDER BY ccstr ASC) as B 
WHERE B.rank = N; 

を言います次のとおりですが、すべてが失敗します:

DELIMITER // 
CREATE PROCEDURE readnth 
(IN NDX INT) 
DECLARE @rank INT; 
SET @rank := 0; 
SELECT ccstr FROM 
(select @rank:[email protected] +1 as rank, ccstr from cards 
order by ccstr ASC) 
as b where b.rank=ndx; 
end // 
delimiter ; 

ここでの一般的な問題は何ですか?

+0

エラーは何ですか? – Barmar

+0

'@ 'で始まる変数を宣言する必要はありません。 – Barmar

+0

これは一般的な"構文エラーがあります "という意味のエラーです。 – Wade

答えて

1

行を削除します。@から始まる

DECLARE @rank INT; 

変数は宣言することはできません。

これをコーディングする別の方法は、準備された文である:

PREPARE stmt FROM CONCAT('SELECT ccstr FROM cards ORDER by ccstr LIMIT ', (ndx+1), ', 1'); 
EXECUTE stmt; 

あなたはLIMITのパラメータは定数ではなく、表現する必要があるため、準備されたステートメントを使用する必要があります。

0

私が前に作った初心者の間違いをすべて理解できません。しかし、試行錯誤によって、次のコードは私が必要としたことを行います。これは、MySQL 5.7の処理がはるかに単純で、微調整を行い、MySQLが決定的に定義したもので、SQL、セキュリティディフィニックスオプティンスを含んでおり、プロシージャ名をバッククォートに入れて非一時変数を宣言しました。

DROP PROCEDURE `thirdguy`; 
CREATE DEFINER=`root`@`localhost` PROCEDURE `thirdguy`(IN `param` INT) 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
BEGIN 
declare NNN int default 0; 
set NNN:=param-1; 
SELECT * FROM `cards` order by ccstr ASC 
limit 1 offset NNN ; 
END 

コメント - ポップアップエディタでコードが間違っていると表示されますが、正しくコンパイルされます。

+0

"NNN:= param-1"ステートメントのスペースも削除しました。 – Wade

+0

この作品はありませんか?そうでない場合は、回答として掲示するべきではありません。私はあなたが 'LIMIT'節で変数を使うことを許されているとは思わないので、私は私の答えで準備されたステートメントを示したのです。 – Barmar

関連する問題