2017-01-12 19 views
0

私はMYSQLデータベースに次のストアドプロシージャを持っています。ストアドプロシージャはlon、latを取得し、別のデータベースとテーブルの更新を行っています。更新変数のMYSQLストアドプロシージャは0

DROP PROCEDURE IF EXISTS annuals.updateSalesFlorida; 
CREATE DEFINER=`dddd`@`%` PROCEDURE `updateSales`(propertyId int) 
BEGIN 

    DECLARE lat FLOAT; 
    DECLARE lon FLOAT; 


    SELECT SitusLongitude,SitusLatitude 
    INTO lon,lat 
    FROM annuals.florida 
    WHERE PropertyID=propertyId 
    LIMIT 1 FOR UPDATE; 

    UPDATE sales.florida 
    SET 
    `SitusLongitude` = lon, 
    `SitusLatitude` = lat 
    WHERE PROPERTYUNIQUEID=propertyId; 

END; 

私は、ストアドプロシージャを実行するたびにSitusLongitudeSitusLatitude列は、私が以前に選択SitusLongitudeSitusLatitudeがそこに実際の値を持っているという事実を知って0です。何らかの理由で変数がlat、lonに設定されていない。どんなアイデアを私は間違っている?

+0

多くの間違いがあります。テーブル、データ、入力または出力を表示しているわけではありませんが、コードが正しかったり間違っているという主張を受け入れる必要があります。理想的には[SQL Fiddle](http://sqlfiddle.com/)を使用して[mcve]を提供してください。 – shmosel

+0

なぜこれを2つのクエリとして実行していますか? 'JOIN'を使用して単一のUPDATEクエリを実行してください。 – Barmar

+0

どのように、私は上記がより簡単になると思った。 – rastacide

答えて

1

問題は、プロシージャのパラメータが表の列と同じ名前であることです。クエリでpropertyidを参照すると、パラメータではなく列が使用されます。列名と変数名は大文字と小文字を区別しないため、PropertyIDpropertyIdのいずれかを入力しても問題ありません。

パラメータには別の名前を使用します(例: p_propertyId

また、2つのクエリは必要ありません。JOINで1つのクエリを実行できます。

UPDATE sales.florida AS s 
CROSS JOIN (
    SELECT * 
    FROM annuals.florida 
    WHERE propertyId = p_propertyId 
    LIMIT 1) AS a 
SET s.SitusLongitude = a.SitusLongitude, s.SitusLatitude = a.SitusLatitude 
WHERE s.PROPERTYUNIQUEID = p_propertyId 

ORDER BYなしLIMITを使用して選択されている行は予測不可能であることを意味することに留意されたいです。

関連する問題