Oracle小知识

用TO_SINGLE_BYTE()函数转成半角 在插入
SQL> !lsnrctl set log_status off;
! 在SQL里面表示执行非SQL的语句
如:
SQL> !fdisk -l
window下是$,linux下是!

跨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 官方下载地址
http://www.oracle.com/technology/global/cn/software/products/oracle8i/index.html

正在连接的用户不能删除,确实要删除的话,如下
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')
原文地址:https://www.cnblogs.com/datalife/p/1985320.html