一、特殊函数

  1:NVL函数

    NVL(str1,str2),如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值;

    eg:select nvl(t.a, 0) from table t;

  2:NVL2函数

    NVL2(str1,str2, str3),如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值;

    eg:select nvl(t.a, 1, -1) from table t;

  3:TRUNC函数

    3.1:trunc for date

      select trunc(sysdate) from dual; --系统日期当天2017/11/2  等价于 select trunc(sysdate, 'dd') from dual;

      select trunc(sysdate, 'yyyy') from dual; --今年第一天2017/1/1

      select trunc(sysdate, 'mm') from dual; --这个月第一天2017/11/1

      select trunc(sysdate, 'd') from dual; --本周第一天

    3.2:trunc for number(直接截取,不进行四舍五入)

      select trunc(123.456) from dual; --123 直接从小数点截取,等价于select trunc(123.456, 0) from dual;

      select trunc(123.456, 1) from dual; --123.4

      select trunc(123.456, -1) from dual; --120

  4:SUBSTR函数

    select substr(123456, 2) from dual; --23456

    select substr(123456, 2, 2) from dual; --23

  5:DECODE函数

    decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

    select decode(sign(A - B), -1, 'B', 'A') from dual; --取A B值最大值,按照上述描述可自行扩展

 

二、语法查询

  1、树查询,关键字connect by prior

    以部门表为例:

    select t.* from department t

    --where t.type_level = ? 可添加过滤条件,自行扩展

         start with t.dept_Code = 'AAA' connect by prior t.dept_code = t.parent_dept_code

  2、查询连续一段时间

    select trunc(sysdate-level+1) d from dual connect by level<=9 order by d; --查询从今天往前连续9天

    参数:SYSDATE-LEVEL+1 可查询未来几天,或者过去几天;SYSDATE-LEVEL+1 今天往前算;SYSDATE+LEVEL-1 今天往后算...(自行扩展)

    参数:LEVEL<=9 控制天数

    eg:

      with t1 as(select trunc(sysdate-level+1) d from dual connect by level<=9 order by d)

      select t1.d , t2.A from t1 left join (select * from table) t2 on t1.d = t2.date oreder by t1.d --主要思路将日期查出做为T1然后关联其他表进行查询,自行扩展

  3、MERGE INTO  如果想在 table_name 上执行insert / update 操作,如果满足条件就update 否则insert 

    merge into table_name alias1

    using(table | view | sub_query) alias2 on (join condition)

    when matched then

      update table_name

      set col1 = col_val1, col2 = col_val2

    when not matched then

      insert into (colums_list) values (column_values);

    eg:

      merge into table1 t1

      using table2 t2

      on(t1.name = t2.name)

      when matched then 

        update

          set t1.value = t2.value;

      when not matched then

        insert into(name, value) values(t2.name, t2.value);

      commit;

 

三、存储过程

  1、有参

    create or replace procedure 存储过程名(参数名 参数类型) is 

    begin

      ...

    exception others then

      dbms_output.put_line('存储过程名' || sql_code || sqlerrm);

      rollback;

    end 存储过程名;

  2、无参

    create or replace procedure 存储过程名 is 

      v_date DATE;--全局变量;

      v_value varchar2(100) := '可以通过:= 直接赋值';

      begin

        ...

        --可以在内部调用其他存储过程,eg:存储过程名(参数列表);

       exception others then

      dbms_output.put_line('存储过程名' || sql_code || sqlerrm);

      rollback;

    end;

  3、删除存储过程

    drop 存储过程名;

 

4、数据库JOB

  1、创建JOB

    BEGIN

      SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME => 'jobname',--job名
                          JOB_TYPE => 'STORED_PROCEDURE',--job类型
                          JOB_ACTION => '存储过程名',--定时执行的存储过程名
                          START_DATE => TO_DATE('10-01-2017 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),--开始日期
                               REPEAT_INTERVAL => 'Freq=Minutely;Interval=30',--执行频率
                          END_DATE => TO_DATE(NULL),--结束日期
                               JOB_CLASS => 'DEFAULT_JOB_CLASS',--
                          ENABLED => TRUE,--是否可用
                          AUTO_DROP => TRUE,--到结束日期时是否自动drop
                          COMMENTS => '备注信息');
    END;

  2、删除JOB  

    BEGIN
      SYS.DBMS_SCHEDULER.DROP_JOB('job名');
    END;

  

      

      

posted on 2017-11-02 14:48  wh1225  阅读(110)  评论(0编辑  收藏  举报