一、特殊函数
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;