PLSQL 常用编程

一、SQL 语句的高级用法

1.SQL语句字符串处理以及时间处理

1)TO_CHAR(TIMECOLUMN,'YYYYMMDDHH24MISS')

   TO_DATE('20090812162512','YYYYMMDDHH24MISS')

   非常的方便

    select lineid,vehicleid,TO_CHAR(GETONSTATIONTIME,'yyyymmdd'),count(*) from icdata group by lineid,vehicleid,TO_CHAR(getonstationtime,'yyyymmdd');

2)sql 语句中的字符串连接

   UPDATE GPSDATA SET VEHICLEID='000'||VEHICLEID WHERE SUBSTR(VEHICLEID,1,2)='X3';

3)数据查询中不重复数据的查询

   SELECT DISTINCT A1 FROM TABLE1;

2.分组查询与Having子句

WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。

GROUP BY 子句用来分组 WHERE 子句的输出。

HAVING 子句用来从分组的结果中筛选行。

如:SELECT ID, V_ID,COUNT(*),TO_CHAR(RECORDTIME,'YYYYMMDD') FROM TABLE GROUP BY V_ID ,ID ,TO_CHAR(RECORDTIME,'YYYYMMDD');

注意 ID,V_ID 必须出现在GROUP BY 后边

3.子查询的重要应用,最接近值查询,即查找线路中最接近某一特定值的记录

SELECT STATIONID FROM STATIONGPSDATA WHERE ABS(LONGTITUDE-PLONGTITUDE)+ABS(LATITUDE-PLATITUDE)=(SELECT MIN(AB(LONGTITUDE-PLONGTITUDE)+ABS(LATITUDE-PLATITUDE))FROM STATIONGPSDATA);

其中PLONGTITUDE、PLATITUDE 是给定的经度和纬度。选出与此经度和纬度最接近的值的站点的编号

首先最里面的SELECT是选出所有记录中与给定经纬度分别的绝对值的差的最小值,然后选出最小值其对应的ID。直接选择ID 是不允许的。

PL/SQL 编程基础

DECLARE                   -- 变量部分
CURSOR mycur IS           -- 游标相当于数组
SELECT * FROM GPSDATA WHERE LINEID='00417' AND VEHICLEID='73620' FOR UPDATE; 

-- FOR UPDATE 是锁定其不能被别的用户查询
MyRec GPSDATA%ROWTYPE;    -- 声明记录集,记录集相当于结构体
x number;                 -- 声明变量
id number;               
BEGIN                     -- 执行部分
OPEN mycur;               -- 打开游标
FETCH mycur INTO MyRec;   -- 将游标的值付给记录集
x:=0;                     -- 将x 赋值 千万不要忘了:
WHILE mycur%FOUND LOOP    -- 循环
x:=x+1;
FINDID(MyRec.LONGTITUDE,MyRec.LAITUDE,ID);  -- 存储过程 见下面的说明
UPDATE GPSDATA SET NEARBYSTATIONID = ID WHERE CURRENT OF mycur;

-- 更新数据,注意CURRENT OF mycur 的用法 非常的方便

FETCH mycur INTO MyRec;
END LOOP;
CLOSE mycur;
DBMS_OUTPUT.PUT_LINE('共计更改了'||x||'条数据');
END;
/

以上是匿名块,缺点是不能够存储在数据库中,而且每次运行都需要编译效率非常的低,

下面介绍的是存储过程,可以存储在数据库中,编译好了直接调用效率高。存储过程相当于函数

CREATE OR REPLACE PROCEDURE FINDID(PLONGTITUDE NUMBER,PLATITUDE NUMBER,PSTATIONID OUT NUMBER)

-- 创建过程 名称 参数(包括输入参数,输出参数)
IS
BEGIN
SELECT STATIONID FROM STATIONGPSDATA WHERE ABS(LONGTITUDE-PLONGTITUDE)+ABS(LATITUDE-PLATITUDE)=(SELECT MIN(ABS(LONGTITUDE-PLONGTITUDE)+ABS(LATITUDE-PLATITUDE)) FROM STATIONGPSDATA) AND ROWNUM<2;
END;
/

--  注意SQL语句中的INTO用法 INTO PSTATIONID

删除归档日志文件
DELETE ARCHIVELOG FROM TIME 'SYSDATE-7';

原文地址:https://www.cnblogs.com/oftenlin/p/2824883.html