Java代碼
select GIS_X,GIS_Y from car_trace where VEHICLE_ID ='" & carid & "' and rownum=1 order by record_time desc
當我們做巡邏車顯示時,常常需要顯示某一輛巡邏車的最新位置,並且需要在所有的巡邏車中取得每一輛車的最新數據。這裡需要用到一些sql語句和一些pl/sql函數,這裡簡要介紹一下:
一:基本的查詢:
1.要查詢某一輛車的最新的經緯度值需要用如下的語句:
Sql代碼
select GIS_X,GIS_Y from (select * from car_trace order by record_time desc) where VEHICLE_ID ='" & carid & "' and rownum=1
而有些人會寫成如下(錯誤的寫法):
Sql代碼
select GIS_X,GIS_Y from car_trace where VEHICLE_ID ='" & carid & "' and rownum=1 order by record_time desc
分析:
明白為什麼要用類似於第一句sql嵌套查詢,如果不用的話,像第二句,先查出了滿足where條件的記錄再order by,即“rownum=1”了再來排序所以枚ㄊ譴砦蟮摹K哉返氖牽Ω孟仍谂藕盟承虻募鍬賈腥ゲ檎衣愕募鍬跡皇遣檎頁鲂枰跫募鍬劑嗽偃ヅ判颍馐淺跹д呷菀著淼牡胤健?/P>
另外,這種sql嵌套查詢在稍微復雜些的地方還是用得比較多的。
2.如果需要在所有的巡邏車中取得每一輛車的最新數據應該怎麼做呢?需要用到sql裡的分組後排序的寫法。語法如下(具體的語法請自行參照文檔):
row_number() over(partition by .. order by ..)
則取所有的巡邏車中取得每一輛車的最新數據的sql語句如下:
Sql代碼
select gis_x,gis_y,VEHICLE_ID from (select row_number() over(partition by vehicle_id order by record_time desc) flagnum,gis_x,gis_y,vehicle_id from car_trace) where flagnum=1
分析:
分組後排序,分組是知道了有多少車,排序是取了每輛車最新的記錄,通過"flagnum=1"來取最新的這條記錄。
二:關於性能的優化:
我們的car_trace時時接收GPS傳過來的經緯度、速度、方向、角度等信息,那麼這張表隨著時間的增加也會變得越來越大,雖然可以用Oracle的“”來解決問題,但我們可以用較為簡單的方法:建立一個最新的軌跡表(car_trace_now),寫個觸發器,當軌跡表有插入數據時就把這記錄觸發到car_trace_now中,沒有則插入,有則更新。這樣,car_trace_now裡總是最新的數據,並且數據量很小,有多少輛車就有多少條數據。代碼如下:
Sql代碼
--是否有相同的記錄
CREATE OR REPLACE FUNCTION IS_EXISTS_REC(ID VARCHAR2)
RETURN NUMBER
AS
iReturn NUMBER;
CURSOR REC_EXISTS IS
SELECT count(*) FROM CAR_TRACE_NOW WHERE VEHICLE_ID=ID;
BEGIN
iReturn := 0;
OPEN REC_EXISTS;
FETCH REC_EXISTS INTO iReturn;
CLOSE REC_EXISTS;
RETURN iReturn;
END;
--觸發器
CREATE OR REPLACE TRIGGER TRI_CAR_TRACE_NOW AFTER
INSERT ON CAR_TRACE FOR EACH ROW
BEGIN
IF (IS_EXISTS_REC(:NEW.VEHICLE_ID)=0) THEN
INSERT INTO CAR_TRACE_NOW(GIS_X, GIS_Y, VEHICLE_ID, RECORD_TIME,SPEED,ANGLE,KM_NUM) VALUES (:NEW.GIS_X,:NEW.GIS_Y,:NEW.VEHICLE_ID,:NEW.RECORD_TIME,:NEW.SPEED,:NEW.ANGLE,:NEW.KM_NUM);
ELSE
UPDATE CAR_TRACE_NOW SET GIS_X=:NEW.GIS_X, GIS_Y=:NEW.GIS_Y,RECORD_TIME=:NEW.RECORD_TIME,SPEED=:NEW.SPEED,ANGLE=:NEW.ANGLE, KM_NUM=:NEW.KM_NUM WHERE VEHICLE_ID=:NEW.VEHICLE_ID;
END IF;
END;
----------------------------------END--------------------------------