2016-03-29 15 views
0

こんにちは私はsprocで「オプション」パラメータを使用しようとしていますが、MYSQLでは許可されていないことを理解していますが、それがnullの場合。しかし、私は構文が間違っていると思うが、私は区切り文字で何かを疑うが、なぜそれが間違っているのか分からない。私はあまり思わSQLサーバ、とはるかによく知っておくnull可能なパラメータを持つMYSQLストアドプロシージャがnullの場合に設定される

謝罪 'Queryが空だった':

DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `addSensorReading`(
     _temp DECIMAL(5,2), 
     _mois DECIMAL(5,2), 
     sourceName varchar(15), 
     _ambTemp DECIMAL(5,2), 
     _ambMois DECIMAL(5,2) 
    ) 
BEGIN 
/*we only get ambient readings from the api every 2 hours (that's how often it updates), so for ease of UI and readability we assume it has not changed as there is no more recent reading. So we get the latest reading with an ambient value if we don't have one provided. */ 
INSERT INTO Reading (moisValue, tempValue, sourceName, ambTempValue, ambMoisValue) 
SELECT _mois, _temp, sourceName, IFNULL(_ambTemp, r1.ambTempValue), IFNULL(_ambMois, r2.ambMoisValue) 
FROM (SELECT ambTempValue 
     FROM Reading 
     WHERE ambTempValue IS NOT NULL 
     ORDER BY creation_time DESC 
     LIMIT 1) AS r1 
CROSS JOIN 
    (SELECT ambMoisValue 
     FROM Reading 
     WHERE ambTempValue IS NOT NULL 
     ORDER BY creation_time DESC 
     LIMIT 1) AS r2 

END; 

DELIMITER ; 

エラーが発生:

DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `addSensorReading`(
     _temp DECIMAL(5,2), 
     _mois DECIMAL(5,2), 
     sourceName varchar(15), 
     _ambTemp DECIMAL(5,2), 
     _ambMois DECIMAL(5,2) 
    ) 

IF (_ambTemp IS NULL) THEN 
    SET _ambTemp := ( SELECT  r.ambTempValue 
         FROM  Readings r 
         WHERE  r.ambTempValue IS NOT NULL 
         ORDER BY r.creation_time DESC 
         LIMIT  1); 
END IF; 

IF (_ambMois IS NULL) THEN 
    SET _ambMois := ( SELECT  r.ambMoisValue 
         FROM  Readings r 
         WHERE  r.ambMoisValue IS NOT NULL 
         ORDER BY r.creation_time DESC 
         LIMIT  1); 
END IF; 


INSERT INTO reading (moisValue, tempValue, sourceName, ambTempValue, ambMoisValue) 
    VALUES (_mois, _temp, sourceName, _ambTemp, _ambMois);; 


DELIMITER ; 

Barmarは答えを与えましたローカル変数や一般的なspocsでより熟達しています。 ありがとう

+0

このような質問をするときは、常にFULLエラーメッセージを投稿してください。 – symcbean

+0

これを実行すると、「クエリが空です」というエラーが表示されます しかし、両方のサブ選択が値を返しますか? –

+0

プロシージャの定義には何を使用していますか? MySQL Workbench、PhpMyAdmin、 'mysql' CLI?取得しているエラーメッセージは、プロシージャを作成しようとしているときに空のクエリをMySQLに送信していることを示しています。 – Barmar

答えて

1

BEGINおよびENDは、Transact-SQLではオプションであり、他のバージョンのSQLではオプションではありません。

DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `addSensorReading`(
     _temp DECIMAL(5,2), 
     _mois DECIMAL(5,2), 
     sourceName varchar(15), 
     _ambTemp DECIMAL(5,2), 
     _ambMois DECIMAL(5,2) 
    ) 
BEGIN  
IF (_ambTemp IS NULL) THEN 
    SET _ambTemp := ( SELECT  r.ambTempValue 
         FROM  Readings r 
         WHERE  r.ambTempValue IS NOT NULL 
         ORDER BY r.creation_time DESC 
         LIMIT  1); 
END IF; 

IF (_ambMois IS NULL) THEN 
    SET _ambMois := ( SELECT  r.ambMoisValue 
         FROM  Readings r 
         WHERE  r.ambMoisValue IS NOT NULL 
         ORDER BY r.creation_time DESC 
         LIMIT  1); 
END IF; 


INSERT INTO reading (moisValue, tempValue, sourceName, ambTempValue, ambMoisValue) 
    VALUES (_mois, _temp, sourceName, _ambTemp, _ambMois); 
END; 

DELIMITER ; 
+0

大丈夫ですがTSQLではバッチセパレータとしてGOを使用しますが、ここでも同じですか? –

+0

私はこれを実行するとエラーが発生します:クエリが空でした しかし、両方のサブ選択値を返しますか? –

0

すべてを1つのINSERTクエリに結合してみてください。

INSERT INTO reading (moisValue, tempValue, sourceName, ambTempValue, ambMoisValue) 
SELECT _mois, _temp, sourceName, IFNULL(_ambTemp, r1.ambTempValue), IFNULL(_ambMois, r2.ambMoisValue) 
FROM (SELECT ambTempValue 
     FROM Reading 
     WHERE ambTempValue IS NOT NULL 
     ORDER BY creation_time DESC 
     LIMIT 1) AS r1 
CROSS JOIN 
    (SELECT ambMoisValue 
     FROM Reading 
     WHERE ambTempValue IS NOT NULL 
     ORDER BY creation_time DESC 
     LIMIT 1) AS r2 
+0

私はまだ "クエリーが空でした"というエラーが表示されます サブ選択はリーディングリーディングからではありませんが、それでもエラーが出ています。 サブ選択は両方とも値 –

+0

を返します。プロシージャ内のクエリからではなく、プロシージャを呼び出す方法からエラーが発生している可能性があります。 – Barmar

+0

そのエラーメッセージを検索すると、すべての例が誤ってmysql_query()を呼び出すのではなく、SQL自体の問題ではありません。 – Barmar

関連する問題