Oracle 常用总结(一)

1. oracle修改表名、列名、字段类型、添加表列、删除表列 

alert table scott.test rename to test1--修改表名
alter table scott.test rename column name to name1 --修改表列名
alter table scott.test modify name1 number(20) --修改字段类型
alter table scott.test add address varchar2(40) --添加表列
alter table scott.test drop name cascadeconstraints --删除表列

2. 将一个表B的(某几个字段的数据)复制到新表A(某几个不同的字段)中

insert into tableA (A, B) select C,D from tableB t;

3. 取出一个表集合,循环(更新,删除,)另外一个表属性(数据,注释,结构),多用于数据表局部同步数据

begin
for i in (select gy.sblx_mc, gy.sblx_dm from nd_gy_sblx gy) loop
execute immediate 'update nd_dm_sblx dm set dm.sblx_mc ='|| i.sblx_mc ||' set dm.sblx_jc='|| i.sblx_dm;
end loop;
end;

在字符串型的变量前面记得加 chr(39);

4. 更新字段数据为大写(小写)

  update nd_dm_sblx set sblx_jc = upper(sblx_jc);
  update nd_dm_sblx set sblx_jc = lower(sblx_jc);

5. 更新数据表字段顺序(有两种方法)

方法一:

a.将原表的建表SQL,通过查看表结构,粘贴下来;

b.将准备更新表字段顺序的数据表全表更新到到临时表中;

c.drop 掉你准备更新数据表;

d.修改你刚才粘贴出来的原表建表语句,修改其中的字段的顺序为你想要的;

e.将临时表中的数据更新到刚创建好的表,drop 掉临时表;

 

方法二:

a.查看数据表物理ID;

select object_id from all_objects where owner='表的所有者' and object_name='具体的表';

b.通过上面的物理ID查看表的字段对应的物理顺序;

select obj#,col#,name from sys.col$ where obj#=131347 order by col#;

c.更新对应的表字段的物理顺序(这步更新需要数据库超级管理员的权限,请慎用):

update sys.col$ set col#=5 where obj#=131347 and name='JKSE';

d.更新完毕之后,重启数据库;

两种方法对比,如果你们项目是协同开发,一个数据库是多个人在使用,方法二并不适合你,因为你要重启数据库,会耽误别人的开发时间,如果你SQL 语句写的比较熟练,第一种方法,只会占用你大概5分钟的时间,就能够办到你的想法;

6. oracle的行标识符rowid与行号rownum

ROWID是查询出来的该行记录的唯一物理地址,后面的rownum则是此次查询结果的序号。

7. oracle创建自增字段方法-ORACLE SEQUENCE

先假设有这么一个表:

create table S_Depart ( 

DepartId INT not null, 

DepartName NVARCHAR2(40) not null, 

DepartOrder INT default 0, 

constraint PK_S_DEPART primary key (DepartId) 

); 

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
a.Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,

CREATE SEQUENCE emp_sequence 

INCREMENT BY 1 -- 每次加几个 

START WITH 1 -- 从1开始计数 

NOMAXvalue -- 不设置最大值 

NOCYCLE -- 一直累加,不循环 

CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

针对S_Depart创建的sequence如下:

create sequence S_S_DEPART 

minvalue 1 

maxvalue 999999999999999999999999999 

start with 1 

increment by 1 

nocache;

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL

CURRVAL=返回 sequence的当前值 

NEXTVAL=增加sequence的值,然后返回 sequence 值 

比如:

emp_sequence.CURRVAL 

emp_sequence.NEXTVAL

可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- NSERT语句的valueS中
- UPDATE 的 SET中

可以看如下例子:

insert into S_Depart(departId,Departname,Departorder)values(S_S_Depart.Nextval,'12345',1);



SELECT empseq.currval FROM DUAL;

但是要注意的是:
- 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?
- 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

b.Alter Sequence
你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .
Alter sequence 的例子

ALTER SEQUENCE emp_sequence 

INCREMENT BY 10 

MAXvalue 10000 

CYCLE -- 到10000后从头开始 

NOCACHE ;

影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。
可以很简单的Drop Sequence

DROP SEQUENCE order_seq;

你可能感兴趣的:(oracle)