1. ORA-01502 重建索引
Begin
For v_index In (Select index_name As iname
From User_Indexes
Where status = 'UNUSABLE') Loop
Execute Immediate 'alter index ' || v_index.Iname || ' rebuild';
End Loop;
End;
2. 重置Sequence
declare
n number(10);
max_id number(10);
diff number(10);
tsql varchar2(100);
begin
select max(s.sfck_id) into max_id from sfieldcheck s;
select max_id - seq_sfck_id.nextval into diff from dual;
tsql := 'alter sequence seq_sfck_id increment by ' || diff;
dbms_output.put_line(tsql);
execute immediate tsql;
select seq_sfck_id.nextval into n from dual;
tsql := 'alter sequence seq_sfck_id increment by 1';
execute immediate tsql;
end;
3. 查看列信息
SELECT * FROM USER_TAB_COLUMNS where COLUMN_NAME = 'col_name';
查看TABLE、VIEW、INDEX、SEQUENCE、PACKAGE等对象信息
select * from user_objects where object_type = 'TABLE' and object_name = 'object_name';
4. DBA_TABLES、ALL_TABLES、USER_TABLES三个视图可以用来查询表信息,它们之间的关系和区别
DBA_TABLES >= ALL_TABLES >= USER_TABLES
DBA_TABLES为DBA拥有的或可以访问的所有表。
ALL_TABLES为某一用户拥有的或可以访问的所有表。
USER_TABLES为某一用户所拥有的所有表。
由上可知,当某一用户本身就为数据库DBA时,DBA_TABLES与ALL_TABLES等价。
5. dba_tables、user_all_tables中num_rows的值和表count(*)不一致原因
num_rows、blocks等一些信息是使用analyze table分析表时填写进去的,命令格式如下:
analyze table tabname compute statistics;
或
call dbms_stats.gather_table_stats(ownname, tabname);
从Oracle 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO(Cost Based Optimization)的统计信息。这个任务默认情况下在工作日晚上10:00 - 6:00和周末全天开启(同在10点运行的Job还有一个AUTO_SPACE_ADVISOR_JOB)。调用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集统计信息。该过程首先检测统计信息缺失和陈旧的对象,然后确定优先级,再开始进行统计。
说明:当做完统计信息后,如果对象的行数修改达到10%,DBMS_STATS就认为是统计信息过旧。
可以通过以下SQL查询这个JOB的运行情况:
SQL> select * from Dba_Scheduler_Jobs where JOB_NAME ='GATHER_STATS_JOB'
然而这个自动化功能已经影响了很多系统的正常运行,晚上10点对于大部分生产系统也并非空闲时段。而自动分析可能导致极为严重的闩锁竞争,进而可能导致数据库Hang或者Crash。
关闭及开启自动搜集功能,有两种方法,分别如下:
方法一:
exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');
exec dbms_scheduler.enable('SYS.GATHER_STATS_JOB');
方法二:
alter system set "_optimizer_autostats_job"=false scope=spfile;
alter system set "_optimizer_autostats_job"=true scope=spfile;
6. 修改日期显示格式
修改当前会话日期格式
alter session set NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';
修改初始化参数
alter system set nls_date_format='yyyy-mm-dd' SCOPE=spfile;
修改客户端注册表
在HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE下,新建字符串值nls_date_format=yyyy-mm-dd hh24:mi:ss
7. 查询本地化参数
与本地化参数有关的数据字典有:
V$NLS_PARAMETERS
V$PROPS$
NLS_DATABASE_PARAMETERS
NLS_INSTANCE_PARAMETERS
NLS_SESSION_PARAMETERS
执行以下任一语句均可:
show parameters;
select * from V$NLS_PARAMETERS;
select * from V$PROPS$;
select * from nls_session_parameters;
8. 插入换行符
换行符 chr(10) 回车符 chr(13)
insert into t(col) values('hello'||chr(10)||'coco');