CREATE 
    OR REPLACE FUNCTION rad ( d NUMBER ) return NUMBER IS pi NUMBER := 3.141592625;
BEGIN
    return d * pi / 180.0;
END;
CREATE 
    OR REPLACE FUNCTION get_distance ( jd1 NUMBER, wd1 NUMBER, jd2 NUMBER, wd2 NUMBER ) return NUMBER IS earth_padius NUMBER := 6378.137;--地球赤道半径(千米),地球平均半径=6371.004 千米
radjd1 NUMBER := rad ( jd1 );
radjd2 NUMBER := rad ( jd2 );
a NUMBER := radjd1 - radjd2;
b NUMBER := rad ( wd1 ) - rad ( wd2 );
s NUMBER := 0;
BEGIN
    s := 2 * Asin(
    Sqrt(
    power( sin( a / 2 ), 2 ) + cos( radjd1 ) * cos( radjd2 ) * power( sin( b / 2 ), 2 )));
s := s * earth_padius;
s := Round( s * 10000 ) / 10000;
return s;
END;
 select get_distance(116.4211883545,39.8548469543,116.4211730957,39.8548660278) from dual;

注意:该函数计算出来的距离单位为:千米

转载地址:http://blog.sina.com.cn/s/blog_5ceb51480102w3mk.html