以下にリストされている記事をいくつか読んで、問題の解決策を見つけようとしました。どちらも同じ問題を抱えているようでした。
私はこれを見ましたが、MySQL のドキュメントで、すべてのプロシージャはデフォルトで非決定論的であると読みました。
これは、SQL Server (MySQL ではない) であるため、私の問題とは何の関係もありません。
プロシージャを作成するために使用しているクエリは次のとおりです。
CREATE PROCEDURE getcusbyzip(zipcode VARCHAR(30),radius VARCHAR(30))
SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (
SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (
SELECT Z.LNG
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) + SIN( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <radius
ORDER BY distance
LIMIT 0 , 20
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE )
そのクエリの後にこのクエリを実行すると、次のようになります。
CALL getcusbyzip(08360,50)
ゼロ行が返されます。しかし、プロシージャ内でまったく同じステートメントを単なるクエリとして実行し、params を次のように配置すると、次のようになります。
SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (
SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (
SELECT Z.LNG
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) + SIN( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <50
ORDER BY distance
LIMIT 0 , 20
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE )
私はまさに私が欲しかったものを手に入れました。答えは1行だけである必要がありますが、プロシージャではないのに結果が返されるのはなぜですか。
BEGIN と END がなかったのではないかと思いましたが、作成行の後に配置し、最後の行の後に END を配置すると、プロシージャの生成に失敗します。