• 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';

  • 相关阅读:
    MySQL length函数
    MySQL between ... and ...
    MySQL Group By使用
    MySQL 聚合函数/分组函数
    MySQL where与like
    MySQL order by与distinct
    城市网络
    滑动窗口
    合并回文子串(NC13230)
    NC50439
  • 原文地址:https://www.cnblogs.com/oftenlin/p/2824883.html
Copyright © 2020-2023  润新知