2017-02-07 5 views
-1

最後までの行として示された選択を実行するストアドプロシージャを作成しようとしています。私のusertableから最も早いStartDateと最新のEndDateを取得し、その日付の間のすべての日を参照カレンダーテーブルから選択します。残念ながら、私が使用しようとするどの構文でも、usertableの値をstart/endday変数に代入するとエラーメッセージが表示されます。私は、私が以下に試した例から正しい構文を指定する多くのリソースを見つけられませんでした。mysql - クエリ結果から(ストアドプロシージャ内の)ローカル変数を初期化する

DELIMITER $$ 
CREATE PROCEDURE seldays() 

BEGIN 

DECLARE startday DATE; 
SET startday = (SELECT MIN(StartDate) from user1table1); 
DECLARE endday DATE; 
SET endday = (SELECT MAX(EndDate) from user1table1); 
SELECT calendar_date FROM calendar WHERE calendar_date >= startday AND calendar_date< endday; 

END $$ 
DELIMITER ; 

Iはまた、無駄にthusly

SELECT MIN(StartDate) from user1table1 INTO endday; 

値を割り当てることを試みました。私はこれらの変数を保存せずにプロシージャを動作させることができるかもしれませんが、それは私が遅かれ早かれ使用する必要があるものです。 ローカル変数をMysqlのクエリ結果に正しく埋め込むにはどうしたらいいですか? MySQLでは

+1

なぜ単純な 'カレンダーCからSELECT calendar_date、(MIN(開始日)MinDateプロパティを選択して、MAX(開始日)に、maxdateからuser1table1)Uここc.calendar_date> = u.mindateとc.calendar_date <= U .maxdate) '?単純な選択ではなく、なぜプロシージャですか? –

+1

変数を宣言する必要があります。 –

+0

Ankit Agrawalありがとうございました。私が逃したような簡単なことでした。 –

答えて

0
SELECT MIN(StartDate) into startday from user1table1 
0

あなたは結果変数を割り当てるためにselect ... into <variable list> from ...statementを使用することができます。

select min(StartDate) into startday from user1table1; 
select max(EndDate) into endday from user1table1; 
+0

Hmmはそれでもエラーを試みました。 ERROR 1064(42000):SQL構文にエラーがあります。 DECLARE endday DATEの近くで使用する正しい構文については、ご使用のMySQLサーバーのバージョンに対応するマニュアルを確認してください。 –

+3

エラーメッセージは変数に値を割り当てることに関連していません。質問全体が誤解を招くことがあります。 – Shadow

+1

2番目の宣言は正面まで移動する必要があります。すべての宣言は、他の宣言の前に来なければなりません。 – Shadow

1

私はちょうど単一のクエリでこれを行うだろう。なぜ変数を気にしますか?

SELECT c.calendar_date 
FROM calendar c JOIN 
    (SELECT MIN(StartDate) as startday, MAX(EndDate) as endday 
     FROM user1table1 
    ) u 
    ON c.calendar_date >= u.startday AND c.calendar_date < u.endday; 
+0

うまくいくかもしれませんが、ある日はローカル変数にクエリ結果を格納する方法が必要になるかもしれないと思っています。 –

0

コメント Ankit Agrawalさんによる「変数が上にする必要があります宣言」のおかげで..

私はこの事は答え結論付けることができます。私は正解としてこの投稿を投稿します。だれかが同じ問題を抱えていれば、すぐに見ることができます。

DECLAREは、BEGIN ... END複合文の内部でのみ使用でき、他の文よりも前にある必要があります。

DELIMITER $$ 
CREATE PROCEDURE seldays() 

BEGIN 

DECLARE startday DATE; 
DECLARE endday DATE; 
SELECT MIN(StartDate) INTO startday FROM user1table1; 
SELECT MAX(EndDate) INTO endday FROM user1table1; 
SELECT calendar_date FROM calendar WHERE calendar_date >= startday AND calendar_date< endday; 

END $$ 
DELIMITER ; 
関連する問題