標籤:oracle 預存程序
新項目需求:
結合百度地圖,在地圖中指定一個地點,擷取此地點周圍1km範圍內所有資料庫中存的單位的地點和資訊標記在地圖上。於是初寫了一把oracle的預存程序,純靠摸索寫的。
後台需要的函數如下:
首先,計算圓弧函數
CREATE OR REPLACE FUNCTION RAD(d number) RETURN NUMBERisPI number :=3.141592625;beginreturn d* PI/180.0;end ;
然後,計算距離函數
CREATE OR REPLACE FUNCTION GetDistance(lat1 number, lng1 number, lat2 number, lng2 number) RETURN NUMBER is earth_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;begin s := 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)ISv_muids VARCHAR(200);v_distance NUMERIC(9,6);BEGIN FOR L_RECORD IN (select * from M_MAINTENACEUNIT)LOOP SELECT 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) THEN v_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||‘)‘;EXCEPTION WHEN OTHERS THEN ROLLBACK; 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預存程序,代碼只是實現了功能,有待改進。
參考:http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html
http://blog.csdn.net/iw1210/article/details/9164573
http://www.cnblogs.com/microsoft-jiang/archive/2008/07/24/1250644.html
本文出自 “java程式猿的部落格” 部落格,請務必保留此出處http://chengxuyuan.blog.51cto.com/5789198/1787169
oracle預存程序---擷取資料庫中到指定經緯度距離的座標