Oracle相关记录

Oracle使用的一些记录


时间处理

SELECT SYSDATE FROM DUAL;
SELECT SYSDATE-1,SYSDATE+1 FROM DUAL;
SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE)+1,-2),'YYYY-MM-DD')  FROM DUAL;
    SELECT MONTHS_BETWEEN(SYSDATE+30,SYSDATE) FROM DUAL;--(如果当月为30天,返回1,为31天返回0.967741935483871)
SELECT TO_CHAR(t.d, 'yyyy-mm-dd'), to_char(t.d, 'day') from (select trunc(sysdate, 'YY') + rownum - 1 as d from dba_objects where rownum <= TO_CHAR(ADD_MONTHS(trunc(sysdate, 'YY'), 12) - 1, 'DDD')) t where to_char(t.d, 'd') = 6;
SELECT TO_CHAR(t.d, 'yyyy-mm-dd'), to_char(t.d, 'day') from (select trunc(sysdate, 'YY') + rownum - 1 as d from dba_objects where rownum <= TO_CHAR(LAST_DAY(ADD_MONTHS(trunc(sysdate, 'YY'),11)),'DDD')) t where to_char(t.d, 'd') = 6;
select (case when jijie = 1 then  '第一季' when jijie = 2 then '第二季' when jijie = 3 then  '第三季'  else '第四季' end) 季度 ,tianshu 天数 from (select to_char(d, 'q') jijie, sum(a) tianshu from (select 1 a, trunc(sysdate, 'YY') + rownum - 1 as d from dba_objects where rownum <= TO_CHAR(LAST_DAY(ADD_MONTHS(trunc(sysdate, 'YY'), 11)), 'DDD'))  group by to_char(d, 'q'))
select count(d)  from(select trunc(sysdate, 'YY') + rownum - 1 as d  from dba_objects where rownum <= TO_CHAR(ADD_MONTHS(trunc(sysdate, 'YY'), 12) - 1, 'DDD')) where to_char(d,'d')<>1 and to_char(d,'d')<>7

执行update时卡死问题解决

进行项目开发时,为了测试项目中SQL执行效果,就用PL/SQL Developer执行了一下,没有commit就继续敲代码了,之后重新使用PL/SQL Developer时,可能是网络原因,PL/SQL Developer断开了与数据库连接并且卡死,便强制结束了。代码敲完后进行测试,项目执行后没效果,并且无响应,debug后发现jdbc执行SQL时没反应了,问了一下谷老师才找到原因。由于在PL/SQL Developer执行update时没有commit,oracle将该条记录锁住了。

可以通过以下办法解决:

先查询锁定记录

SELECT s.sid, s.serial# FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid; 

然后删除锁定记录

ALTER system KILL session 'SID,serial#';

树查询

数据库表结构:

CREATE TABLE "MODEL"   
(  
"ID" NUMBER(5,0) NOT NULL ENABLE,   
"NAME" VARCHAR2(40) NOT NULL ENABLE,   
"PID" NUMBER(5,0) NOT NULL ENABLE  
) ; 

插入数据:

INSERT INTO "MODEL" VALUES ('1', '中国', '0');  
INSERT INTO "MODEL" VALUES ('11', '北京', '1');  
INSERT INTO "MODEL" VALUES ('12', '河北', '1');  
INSERT INTO "MODEL" VALUES ('13', '山西', '1');  
INSERT INTO "MODEL" VALUES ('14', '山东', '1');  
INSERT INTO "MODEL" VALUES ('131', '太原', '13');  
INSERT INTO "MODEL" VALUES ('132', '长治', '13');  
INSERT INTO "MODEL" VALUES ('133', '大同', '13');  
INSERT INTO "MODEL" VALUES ('135', '临汾', '13');  
INSERT INTO "MODEL" VALUES ('121', '石家庄', '12');  
INSERT INTO "MODEL" VALUES ('122', '保定', '12');  
INSERT INTO "MODEL" VALUES ('123', '邯郸', '12');  
INSERT INTO "MODEL" VALUES ('124', '唐山', '12');  
INSERT INTO "MODEL" VALUES ('111', '海淀', '11');  
INSERT INTO "MODEL" VALUES ('112', '朝阳', '11');  
INSERT INTO "MODEL" VALUES ('113', '昌平', '11');  
INSERT INTO "MODEL" VALUES ('1111', '中关村', '111');
select c.id, c.name, level, sys_connect_by_path(c.name, '-')  
  from (select * from model) c  
 start with c.name = '中关村'  
connect by c.id = prior c.pid 
select c.id, c.name, level, sys_connect_by_path(c.name, '-')  
  from (select * from model) c  
 start with c.name = '中国'  
connect by prior c.id =  c.pid