0

次の「haversin」アルゴリズムを SQL 関数として実装しています。

DELIMITER //
CREATE FUNCTION `db`.`haversin` (slat FLOAT, slon FLOAT, dlat FLOAT, dlon FLOAT) 
RETURNS FLOAT
BEGIN
 declare alphaLon,a FLOAT;
 set alphaLon=(slon–dlon);
 set a=3956*2*ASIN(SQRT( POWER(SIN((slat - abs(dlat)) * pi()/180 / 2),2) + COS(slat * pi()/180 ) * COS(abs(dlat) *  pi()/180) * POWER(SIN((alphaLon) *  pi()/180 / 2), 2) ));
 return a;
 END 
//delimiter;

上記を実行すると、1064 エラー 'syntax error near //delimiter' が表示されますが、関数は作成されます。

関数を実行すると、最も混乱するのは次の結果です。

mysql> SELECT haversin(2.0,45.0,2.0,1.2);
ERROR 1054 (42S22): Unknown column 'slon–dlon' in 'field list'

これはどのように可能ですか?

4

1 に答える 1

1
  1. 貼り付けたコードには、MySQL クライアントへの 3 つの指示が含まれています。

    1. そのステートメント区切り文字を//;に変更します。

    2. CREATE FUNCTIONサーバーにコマンドを送信します。と

    3. 不明な命令delimiter;

    したがって、最初の 2 つのコマンドは成功し、3 番目のコマンドは失敗します。3 番目のコマンドの失敗を修正するには、delimiterキーワードと必要な新しい区切り文字の間に空白を挿入します。

  2. 保存されたプログラムは、実行されるまで評価されません。したがって、実行時エラー (「不明な列」など) は、関数が呼び出されるまで検出されません。実際、関数が定義された後にデータベース スキーマが変更される可能性があることを考えると、これは完全に理にかなっています。

    マイナス文字が実際にはEN DASH (U+2013) であるため、このエラーが表示されます。算術減算の場合は、 HYPHEN-MINUS (U+002D)に置き換えます。

于 2013-06-17T13:22:16.463 に答える