oracle存储过程

新项目需求:

结合百度地图,在地图中指定一个地点,获取此地点周围1km范围内所有数据库中存的单位的地点和信息标记在地图上。于是初写了一把oracle的存储过程,纯靠摸索写的。

后台需要的函数如下:

首先,计算圆弧函数

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 GetDistance(lat1 number,lng1 number,lat2 number,lng2 number) RETURN NUMBER isearth_padius number := 6378.137;radLat1      number := rad(lat1);radLat2      number := rad(lat2);a            number := radLat1 - radLat2;b            number := rad(lng1) - rad(lng2);s            number := 0;
begins := 2 *Asin(Sqrt(power(sin(a / 2), 2) +cos(radLat1) * cos(radLat2) * power(sin(b / 2), 2)));s := s * earth_padius;s := Round(s * 10000) / 10000;return s;end;

接下来是我自己写的存储过程:

CREATE OR REPLACE PROCEDURE distance_maintunit(p_cur out sys_refcursor, center_lat in number , center_lng in number)
IS
v_muids VARCHAR(200);
v_distance NUMERIC(9,6);
BEGINFOR L_RECORD IN (select * from M_MAINTENACEUNIT)
LOOPSELECT GetDistance(L_RECORD.Lat,L_RECORD.Longitude,center_lat,center_lng) INTO v_distance FROM dual;/*dbms_output.put_line('distance:' || v_distance);*/IF (v_distance <=1)THENv_muids:= v_muids || L_RECORD.muid || ','; END IF;
END LOOP;v_muids:= v_muids || '-1';dbms_output.put_line(v_muids);open p_cur for 'select * from m_maintenaceunit where muid in ('||v_muids||')';EXCEPTIONWHEN OTHERS THENROLLBACK;dbms_output.put_line(SQLERRM);END;

由于使用mybatis,所以service调用如下:

    @Overridepublic List<MaintunitDto> getMaitunitByProcedures(Double lat, Double lng) {Map<String ,Object> map=new HashMap<String, Object>();map.put("lng", lng);map.put("lat", lat);try {geoDao.getMaitunitByProcedures(map);}catch(UncategorizedSQLException e) {
//          System.out.println(e);e.printStackTrace();}@SuppressWarnings("unchecked")List<MaintunitDto> siteList=(List<MaintunitDto>)map.get("maintunits");return siteList;}

这里跟我之前转载的那篇关于oracle存储过程的文章有关联(如何调用一个返回集合的存储过程)

mapper.xml中的调用:

<select id="getMaitunitByProcedures" statementType="CALLABLE" parameterType="java.util.Map"><![CDATA[ {call distance_maintunit(#{maintunits,jdbcType=CURSOR,mode=OUT,resultMap=MAINTUNIT_MAP,javaType=ResultSet},#{lat,jdbcType=DOUBLE,mode=IN},#{lng,jdbcType=DOUBLE,mode=IN})}]]>
</select><resultMap type="com.cseds.geo.dto.MaintunitDto" id="MAINTUNIT_MAP">
</resultMap>

dao中调用:

public List<MaintunitDto> getMaintUnitList(@Param("lng") Double lng, @Param("lat") Double lat);

由于第一次写oracle存储过程,代码只是实现了功能,有待改进。


在 Oracle 中根据经纬度计算两地之间的距离

在 Oracle 中根据经纬度计算两地之间的距离

获得弧度的函数:

CREATE OR REPLACE FUNCTION Radian(d number) RETURN NUMBER
is
PI number :=3.141592625;begin
return  d* PI/180.0;
end ;

测试一下这个函数:

select Radian(360) from dual;

根据经纬度计算距离的函数:

CREATE OR REPLACE FUNCTION GetDistance(lat1 number,lng1 number,lat2 number,lng2 number) RETURN NUMBER isearth_padius number := 6378.137;radLat1      number := Radian(lat1);radLat2      number := Radian(lat2);a            number := radLat1 - radLat2;b            number := Radian(lng1) - Radian(lng2);s            number := 0;
begins := 2 *Asin(Sqrt(power(sin(a / 2), 2) +cos(radLat1) * cos(radLat2) * power(sin(b / 2), 2)));s := s * earth_padius;s := Round(s * 10000) / 10000;return s;end;

示例,根据城市名计算距离:

东方明珠塔的经纬度是:121.506656,31.245087
陆家嘴地铁站的经纬度是:121.508883,31.243481

SQL> select GetDistance('121.506656','31.245087','121.508883','31.243481') from dual;

输出结果是 0.2649 千米


sql server 计算两个经纬度点之间的距离

这里用到的算法和地球半径等数据均来自网络,此文只作整理记录。

地球半径值采用赤道半径 6378137.0米,这是1980年的国际标准数据。

下面是在数据库中写的自定义函数,传入两个经纬度点的数据,共4个参数,返回以米为单位的两点之间的距离

    CREATE FUNCTION [f_GetDistance]  (   @GPSLng DECIMAL(12,6),  @GPSLat DECIMAL(12,6),  @Lng  DECIMAL(12,6),  @Lat DECIMAL(12,6)  )  RETURNS DECIMAL(12,4)  AS  BEGIN  DECLARE @result DECIMAL(12,4)  SELECT @result = 6378137.0*ACOS(SIN(@GPSLat/180*PI())*SIN(@Lat/180*PI())+COS(@GPSLat/180*PI())*COS(@Lat/180*PI())*COS((@GPSLng-@Lng)/180*PI()))  RETURN @result  END  GO  

获取数据库中到指定经纬度距离的坐标相关推荐

  1. 关于C#中使用SQLDMO来获取数据库中的一些操作

    首先添加SQLDMO的引用 1:通过SQLDMO来获取可用的网络数据库(区域网当中) public static List<string> get可用SQL服务器()       {    ...

  2. 如何获取数据库中标的所有字段和数据类型?

    如何获取数据库中标的所有字段和数据类型? 目录 如何获取数据库中标的所有字段和数据类型? #获取表中所有字段

  3. Java中获取数据库中两个时间的相差秒数

    场景 Java中获取数据库中结束时间与开始时间相差的秒数. 实现 Long betweenTime=0l;betweenTime =((b.getFinishTime().getTime()-b.ge ...

  4. php 获取数据库中的信息,php获取数据库中数据的实现方法

    废话不多说,直接上代码 header("Content-type:text/html;charset=utf-8");//字符编码设置 $servername = "lo ...

  5. html使用thymeleaf模板时,获取数据库中字符串值,拆分为list根据下标获取对应的值的方法

    1. 需求 html使用thymeleaf模板时,获取数据库中字符串值,拆分为list根据下标获取对应的值的方法 2. 方法 2.1 参考官网:https://www.thymeleaf.org/do ...

  6. mysql 获取数据库中最大的日期

    mysql 获取数据库中最大的日期 select DATE_FORMAT(max(over_time),'%Y-%m-%d') from 表名格式化参考 %a 缩写星期名 %b 缩写月名 %c 月,数 ...

  7. Js获取URL中的指定参数

    平时项目中页面跳转需要携带参数,为方便获取URL中指定参数 整理了两个方法 方法1:URLSearchParams() URLSearchParams对象定义了操作 URL传递参数的方法 //获取ur ...

  8. android 读取mysql中的图片_Android 通过API获取数据库中的图片文件方式

    Overview 今天复习了一下Android 如何将我们数据库中图片获取出来,并且将其转换为bitmap进行显示. 开发环境以及技术 使用Visual Studio 2019 Android Stu ...

  9. server sql 数据总行数_SqlServer中获取数据库中每个表的行数

    CREATE TABLE #RowCounts(NumberOfRows BIGINT,TableName VARCHAR(128)) EXEC sp_MSForEachTable 'INSERT I ...

最新文章

  1. Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)
  2. JAVA基础5——与String相关的系列(1)
  3. HDU多校4 - 6988 Display Substring(后缀自动机+二分)
  4. [python opencv 计算机视觉零基础到实战] 一 opencv的helloworld
  5. java php html,java和html的区别是什么
  6. SOLOv2论文简读
  7. python电脑版-mPython
  8. 数据库期末总结笔记( 零基础 )-第二章 关系数据库
  9. 【Vegas原创】红烧肉的做法
  10. React Hooks 起手式,实现一个「高颜值实用」的色彩设计工具
  11. 响应式编程笔记三:一个简单的HTTP服务器
  12. PDF论文--字体未嵌入解决办法
  13. Hive指定位置增加字段及解决columns have types incompatible with the existing columns in their respective positio
  14. make[1]: *** Waiting for unfinished jobs....
  15. Highcharts3D环形图
  16. ssh远程No route to host问题解决
  17. ABAP CDS编写
  18. TIA博途中通过关键字AT实现变量覆盖的具体方法及示例程序
  19. 安装目录里无法找到计算机,Win7系统下programdata文件夹找不到怎么办?
  20. 被骗几十万总结出来的Ddos攻击防护经验!(转载)

热门文章

  1. android 悬浮窗权限申请
  2. 借记卡、贷记卡、预付卡、准贷记卡、信用卡
  3. Python这么强?红包杀手、消息撤回也可以无视!
  4. C语言,判断数字的位数
  5. swagger 返回值描述
  6. PDF文件怎么编辑,PDF怎么删除空白页面
  7. 国家互联网金融整治 将封堵服务器在境外平台
  8. 数据库连接失败出现4064错误
  9. MD5 加密已被破解
  10. 数据结构第二版(朱昌杰版)栈和队列二