2

GoDaddy の phyMyAdmin 経由で MySQL を使用しています。このステートメントを実行すると、1 つの整数値が問題なく返されます。

SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = 2) LIMIT 0,1;

ただし、次のストアド プロシージャを作成しようとすると、次のエラーが発生します。

1064 - SQL 構文にエラーがあります。25 行目の「near ''」を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

DROP PROCEDURE IF EXISTS `spGetPreferredRunNumbers`$$
CREATE PROCEDURE `spGetPreferredRunNumbers`(IN prefTimeRange INT(4), INOUT run1 INT(4), INOUT run2 INT(4), INOUT run3 INT(4), INOUT run4 INT(4), INOUT run5 INT(4))
BEGIN
IF (prefTimeRange = 2) THEN BEGIN
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 0,1  INTO run1;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 1,1  INTO run2;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 2,1  INTO run3;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 3,1  INTO run4;
SET run5 = -1;
END;
ELSE IF (prefTimeRange = 3) THEN BEGIN
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 0,1  INTO run1;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 1,1  INTO run2;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 2,1  INTO run3;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 3,1  INTO run4;
SET run5 = -1;
END;
ELSE BEGIN
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 0,1  INTO run1;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 1,1  INTO run2;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 2,1  INTO run3;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 3,1  INTO run4;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 4,1  INTO run5;
END;
END IF;
END$$
DELIMITER;

はい、制限が異なる他の select ステートメントを個別にテストしましたが、LIMIT 4,1 を選択するときに prefTimeRange に 2 または 3 を使用する場合を除いて、それらも正常に動作します。prefTimeRange の 2 と 3 は 4 つの結果しか返さないため、prefTimeRange が 2 または 3 の場合は run5 に -1 を割り当てます。

これを行うかどうかに関係なく、まったく同じエラーが発生します:prefTimeRange = 3 またはこれ: prefTimeRange = "3"

はい、正しい区切り文字は $$ であることを phpMyAdmin に伝えることを覚えています。

何が欠けていますか????

4

2 に答える 2

0

これは非常に悪い mysql の問題であり、適切に文書化されている場所はありません。MYSQL ストアド プロシージャ - ELSE の前に余分な行またはスペースを残すと、else 部分は何があっても実行されます。

IF <your condition> then
<do this code>
                   <-- extra empty line
ELSE
<this always executes no matter what is in IF statement>

上記の例では、 ELSE の上に空行を残すと、else 部分が常に実行されます。if-else の else 部分の上に余分な行を残さないでください。

于 2016-09-25T23:19:33.207 に答える
0

解決済み: ELSE と IF の間のスペースを削除する必要があることが判明しました。

于 2013-04-15T22:14:54.310 に答える