分类: Oracle
2010-09-09 11:39:45
跨schema的交叉型trigger在exp/imp时会丢失,因为所依赖的基表在exp/imp时断开了。
除非你把这些shema全都导出。
Number的数据声明如下:
表示 作用 说明
Number(p, s) 声明一个定点数 p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,scale的取值范围为-84到127
Number(p) 声明一个整数 相当于Number(p, 0)
Number 声明一个浮点数 其精度为38,要注意的是scale的值没有应用,也就是说scale的指不能简单的理解为0,或者其他的数。
定点数的精度(p)和刻度(s)遵循以下规则:
? 当一个数的整数部分的长度 > p-s 时,Oracle就会报错
? 当一个数的小数部分的长度 > s 时,Oracle就会舍入。
? 当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
? 当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入
oracle update 多表关联
UPDATE a
SET (ID, NAME) = (SELECT b.ID, b.NAME
FROM b
WHERE a.ID = b.ID)
WHERE EXISTS (SELECT 1
FROM b
WHERE a.ID = b.ID)
查看SCN:
SELECT dbms_flashback.get_system_change_number FROM dual;
SELECT CURRENT_SCN FROM V$DATABASE;
注意理解系统时间标记与scn 的每5 分钟匹配一次这句话,举个例子,比如scn:339988,339989 分别匹配08-05-3013:52:00 和2008-13:57:00,则当你通过as of timestamp 查询08-05-30 13:52:00 或08-05-30 13:56:59 这段时间点
内的时间时,oracle 都会将其匹配为scn:339988 到undo 表空间中查找,也就说在这个时间内,不管你指定的时间点是什么,查询返回的都将是08-05-30 13:52:00 这个时刻的数据。
查看SCN 和 timestamp 之间的对应关系:
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
当查询的记录的结果集大于总记录的20%时,一定要使用全表扫描
当AWR显示,占用资源较多的SQL是类似时,这是对这些SQL就应该使用绑定变量来减少硬解析.
select name,value ,ISSYS_MODIFIABLE from v$parameter
如果ISSYS_MODIFIABLE 返回的是false,说明该参数无法用alter system语句动态修改,需要重启数据库
oracle子查询中能使用order by
from 子句后面的内联视图是可以使用order by子句进行排序的。
然而,其它视图或子查询是不能用order by进行排序的
如果你要用选择前几条的话,需要在套一层变成from后面的内联视图。
比如
select * from dept a
2 where a.deptno in
3 (
select depton from (
4 select b.deptno from dept b
5 order by b.dname
6 ) [where rownum < 5])
修改temp表空间自动增长:
alter database tempfile 'D:\ORACLE\ORADATA\DBA\TEMP01.DBF' autoextend on next 20m;
修改表空间自动增长:
alter database datefile 'D:\ORACLE\ORADATA\DBA\user01.DBF' autoextend on next 20m;
alter index rebuild与alter index rebuild online的区别
online时可以在该索引的基表上执行DML,在在对基表操作的同时可以REBUILD INDEX,但是不能执行DDL语句,所以他们的锁机制是不样的。
创建索引时通常会对该表设置一个表级共享(DML)锁,如果设置ONLINE ,
如果是非ONLINE方式,通常会对该表设置一个表级共享(DML)锁,那么就对DML语句冲突,如果设置ONLINE ,(会使用临时日志IOT表来记录中间改变的数据),但要使用两倍于传统方法的空间.表会变成行级共享锁,在创建索引或者ALTER完成后,对临时日志表与基表进行MERGE
注意并行处理,DDL,位图索引不能使用ONLINE。
colb,字符串大对象,存的是长字符串数据
blob,二进制大对象,存的是二进制型,比如图像、音频数据
SQLPLUS 默认不是自动提交的.
自动提交命令:
SQL>set autocommit on
临时表空间不能脱机。system,和正在使用(有活动session或transaction)的也不能。
退出SQLPLUS 时会自动提交
指定DDL,如CREATE , ALTER, DROP ,会自动提交
执行DCL,如GRANT,REVOKE,会自动提交
查询正在执行的sql
select OSUSER, PROGRAM, USERNAME, SCHEMANAME, B.Cpu_Time, STATUS, B.SQL_TEXT
from V$SESSION A
LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS
AND A.SQL_HASH_VALUE = B.HASH_VALUE
where b.SQL_TEXT is not null
order by b.cpu_time desc
Oracle在to_char()函数在计算一年中第几周是从该年的1月1日开始的。
oracle 8i 官方下载地址
正在连接的用户不能删除,确实要删除的话,如下
1、select sid,serial#,username from v$session where user='USERNAME';
2、alter system kill session 'sid,serial#';
3、drop user username cascade
在排除索引限制的条件下,如果索引还是没有被引用,可以检查下参数。
optimizer_index_cost_adj为100,该参数影响优化器选择索引还是全表扫描的倾向,将其修改为35.
在Oracle中,要获得日期中的年份,例如把sysdate中的年份取出来,并不是一件难事。
常用的方法是:Select to_number(to_char(sysdate,''yyyy'')) from dual,
而实际上,oracle本身有更好的方法,那就是使用Extract函数,
使用方法是:Select Extract(year from sysdate) from dual,这种方法省掉了类型转换,看上去更加简洁。
相应的,要取得月份或日,可以用select extract (month from sysdate) from dual和select extract (day from sysdate) from dual。
此方法获得的结果,是数值型的,大家可以设置一个方法测试一下。
select EXTRACT(year FROM to_date('2009-11-10','yyyy-mm-dd')) year from dual;
查询数据库默认的表空间类型:
SQL> select property_name,property_value from database_properties where property_name='DEFAULT_TBS_TYPE';
PROPERTY_NAME PROPERTY_VALUE
------------------ ------------------
DEFAULT_TBS_TYPE BIGFILE
在10g中,有一个特性,就是bigfile tablespace,这种类型的表空间只能有一个数据文件,且该数据文件允许有4G的数据快,即如果db_block_size=8k的话,最大容量为4G*8K=32T,当然,这个还要看操作系统的限制了。
修改数据库默认的表空间类型为smallfile,就可以为表空间创建多个数据文件了。
SQL> alter database set default smallfile tablespace;
Database altered.
也可以在创建表空间时,指定表空间类型:create smallfile/bigfile tablespace ....
exp 失败执行的脚本:
catexp.sql
这个脚本是用于生成exp命令执行时所需要的一些表和视图,在执行exp命令出现找不到什么什么表,什么什么视图时使用。
catmeta.sql
这个脚本是在升级后执行exp命令出现错误时运行,说是因为升级不成功,运行这个脚本可以重新创建系统表。
select date'2009-11-11' as d from dual;
select * from t where t.day=date'2009-11-11';
日期一般就用to_date(str,format)格式转换
像'yyyy-mm-dd'这样的可以直接用date'xxxx'简化
RAC 启动,一般的话,启动底层crs,下面的服务都起来了.
在root用户下启动crs:
crsctl start crs
手动启动rac的命令如下:
||||||||||||||||||||||||||||||||||||
RAC的启动和关闭
如果都遵循了上面的安装步骤,那么每次节点重新启动的时候,所有服务都会自动启动,如果需要关闭或者启动某个节点,如下所示
*停止RAC
emctl stop dbconsole
srvctl stop instance -d orcl -i orcl1
srvctl stop instance -d orcl -i orcl2
srvctl stop asm -n rac1
srvctl stop asm -n rac2
srvctl stop nodeapps -n rac1
srvctl stop nodeapps -n rac2
*启动RAC
和上面的步骤正好相反即
srvctl start nodeapps -n rac1
srvctl start nodeapps -n rac2
srvctl start asm -n rac1
srvctl start asm -n rac2
srvctl start instance -d orcl -i orcl2
srvctl start instance -d orcl -i orcl1
emctl start dbconsole
使用 SRVCTL 启动/停止所有实例
启动/停止所有实例及其启用的服务。
srvctl start database -d orcl
srvctl stop database -d orcl
sqlplus命令save可以把sql语句保存到文件中,可是默认的存放路径是$ORACLE_HOME/bin,即sqlplus可执行文件存放的位置,当然有的人说在文件名前加绝对路径即可:save d:\oracle\admin\oradb\emp.sql
可是这种写法未免太麻烦,特别是使用get命令,也得使用绝对路径,因此如果能够修改save的默认位置,那么save/get就好写的多了。
查询某一对象的类型,比如查询'v$datafile'是同义词还是视图?
select * from all_objects where object_name=upper('v$datafile')