Oracle 常用SQL命令
创建表空间
1.创建默认表空间WLP_DAT
CREATE TABLESPACE "MYSPACE" DATAFILE 'D:\oracle\oradata\orcl\data/WLP_DAT.dbf' SIZE 32M REUSE AUTOEXTEND ON NEXT 32M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
2.创建临时表空间WLP_TEMP(用于缓存,可以不建)
ALTER TABLESPACE "TEMP" ADD TEMPFILE
'D:\oracle\oradata\orcl\data/WLP_TEMP.dbf' SIZE 32m REUSE autoextend on next 32m;
创建用户并授权
1 CREATE USER "WLPING" PROFILE "DEFAULT" 2 IDENTIFIED BY "123456" 3 DEFAULT TABLESPACE "MYSPACE" //默认指定表空间 4 TEMPORARY TABLESPACE "TEMP" //指定缓存表空间 5 ACCOUNT UNLOCK; //用户非锁定 6 7 GRANT EXECUTE ON dbms_comparison TO "WLPING"; 8 GRANT UNLIMITED TABLESPACE TO "XIR_MD"; 9 GRANT "CONNECT" TO "XIR_MD"; 10 GRANT "RESOURCE" TO "XIR_MD"; 11 12 -- GRANT DBA TO XIR_MD;
PROFILE:Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用Create Profile命令创建一个Profile,用它来实现对数据库资源的限制使用,如果把该profile分配给用户,则该用户所能使用的数据库资源都在该profile的限制之内。具体管理内容有:CPU的时间、I/O的使用、IDLE TIME(空闲时间)、CONNECT TIME(连接时间)、并发会话数量、口令机制等。
用户管理
oracle内部有两个建好的用户:system和sys。用户可直接登录到system用户以创建其他用户,因为system具有创建其他用户的权限。 在安装oracle时,用户或系统管理员首先可以为自己建立一个用户。
※ 使用sys as sysdba 可以获得数据库最高权限
一、创建用户
语法[创建用户]: create user 用户名 identified by 口令[即密码];
例子: create user test identified by test;
语法[更改用户]: alter user 用户名 identified by 口令[改变的口令];
例子: alter user test identified by 123456;
二、删除用户
语法:drop user 用户名;
例子:drop user test;
若用户拥有对象,则不能直接删除,否则将返回一个错误值。指定关键字cascade,可删除用户所有的对象,然后再删除用户。
语法: drop user 用户名 cascade;
例子: drop user test cascade;
三、授权角色
oracle为兼容以前版本,提供三种标准角色(role):connect/resource和dba.
(1)讲解三种标准角色:
1》. connect role(连接角色)
--临时用户,特指不需要建表的用户,通常只赋予他们connect role.
--connect是使用oracle简单权限,这种权限只对其他用户的表有访问权限,包括select/insert/update和delete等。
--拥有connect role 的用户还能够创建表、视图、序列(sequence)、簇(cluster)、同义词(synonym)、回话(session)和其他 数据的链(link)
2》. resource role(资源角色)
--更可靠和正式的数据库用户可以授予resource role。
--resource提供给用户另外的权限以创建他们自己的表、序列、过程(procedure)、触发器(trigger)、索引(index)和簇(cluster)。
3》. dba role(数据库管理员角色)
--dba role拥有所有的系统权限
--包括无限制的空间限额和给其他用户授予各种权限的能力。system由dba用户拥有
(2)授权命令
语法: grant connect, resource to 用户名;
例子: grant connect, resource to test;
(3)撤销权限
语法: revoke connect, resource from 用户名;
列子: revoke connect, resource from test;
角色管理
四、创建/授权/删除角色
除了前面讲到的三种系统角色----connect、resource和dba,用户还可以在oracle创建自己的role。用户创建的role可以由表或系统权限或两者的组合构成。为了创建role,用户必须具有create role系统权限。
1》创建角色
语法: create role 角色名;
例子: create role testRole;
2》授权角色
语法: grant select on class to 角色名;
列子: grant select on class to testRole;
注:现在,拥有testRole角色的所有用户都具有对class表的select查询权限
3》删除角色
语法: drop role 角色名;
例子: drop role testRole;
注:与testRole角色相关的权限将从数据库全部删除
表操作
一、创建表
1 CREATE TABLE MY_TABLE ( 2 ID NUMBER(10) PRIMARY KEY, 3 NAME VARCHAR2(50) NOT NULL, 4 BIRTHDAY DATE 5 ); 6 // 表名注释 7 COMMENT ON TABLE my_table IS '个人信息表'; 8 // 字段名注释 9 COMMENT ON COLUMN MY_TABLE.ID IS 'ID'; 10 COMMENT ON COLUMN MY_TABLE.NAME IS '姓名';
组合主键约束:CONSTRAINT PK_MY_TABLE PRIMARY KEY (column1,column2)
二、修改约束
禁用约束 disable constraint 约束名字;
删除约束 drop constraint 约束名字;
新增约束 alter table <表名 > add constraint <主键名>
约束介绍
1.主键约束:
要对一个列加主键约束的话,这列就必须要满足的条件就是分空
因为主键约束:就是对一个列进行了约束,约束为(非空、不重复)
以下是代码 要对一个列加主键,列名为id,表名为emp
alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)
alter table emp add constraint ppp primary key (id)
就是给一列的数据进行了限制
比方说,年龄列的数据都要大于20的
表名(emp) 列名(age)
alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)
alter table emp add constraint xxx check(age>20)
这样的约束就是给列的数据追加的不重复的约束类型
alter table 表名 add constraint 约束名称 约束类型(列名)
比方说可以给ename列加个unique,让ename列的数据不重复
例子:
alter table emp add constraint qwe unique(ename)
意思很简单就是让此列的数据默认为一定的数据
alter table 表名称 add constraint 约束名称 约束类型 默认值) for 列名
alter table emp add constraint jfsd default 10000 for gongzi
这个有点难理解了,外键其实就是引用
因为主键实现了实体的完整性,
外键实现了引用的完整性,
应用完整性规定,所引用的数据必须存在!
比方说一个表名称叫dept 里面有2列数据 一列是ID一列是ENAME
id:表示产品的编号
ename:表示产品的名称
id:表示用户号
did:表示购买的产品号
alter table 表名 add constraint 约束名称 约束类型 (列名) references 被引用的表名称(列名)
例子:
alter table emp add constraint jfkdsj foreign key (did) references dept (id)
三、操作表
rename 表名 to 表名 //修改表名 truncate table 表名 //删除表中的所有数据,速度比delete快很多,截断表 drop table 表名 //删除表
四、修改字段
alter table 表名 modify (字段 字段类型); -- 修改字段数据类型 alter table 表名 rename column 列名 to 列名 --修改字段名 alter table 表名 add 列名 字段类型; --增加字段 alter table 表名 drop column 字段名; -- 删除字段
五、修改数据
insert into 表名(值1,值2) values(值1,值2); // 插入数据 update 表名 set 字段=值 [修改条件] //修改数据 delete from table where 条件 //删除数据
六、查询
/* 获取表:*/ select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户的表 select table_name from dba_tables; //所有表,包括系统表(需要dba权限) select table_name from dba_tables where owner='WLPING'; //某个用户的表,包括所有的系统表(需要dba权限)
/*查询系统时间*/
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
导入导出
EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。
IMP只适用于EXP导出的文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件。
一、导入dmp文件
imp
1)imp 用户名/密码@服务器IP:端口/服务名 file=dmp文件路径;
imp username/password@127.0.0.1:1521/orcl file=D:\oracle\admin\orcl\dpdump\a.dmp;
2)将exp_export.dmp 中的表table1,table2导入
imp system/manager@hostname:1521/ora11g file=exp_export.dmp tables=table1,table2
impdp
1)导到指定用户下
impdp scott/tiger DIRECTORY=DUMP_DIR DUMPFILE=expdp_export.dmp SCHEMAS=scott;
2)改变表的owner
impdp system/manager DIRECTORY=DUMP_DIR DUMPFILE=expdp_export.dmp TABLES=scott.dept REMAP_SCHEMA=scott:system;
3)导入表空间
impdp system/manager DIRECTORY=DUMP_DIR DUMPFILE=expdp_export.dmp TABLESPACES=example;
3)导入整个库文件
impdb system/manager DIRECTORY=DUMP_DIR DUMPFILE=expdp_export.dmp full=y;
二、导出dmp文件
※ 导入导出指定日志输出文件 log=exp_export.log
※ 在导出命令后面加上 compress=y 可以对导出文件进行压缩
1.导出整个数据库实例下的所有数据
2.导出指定用户的所有表
3.导出指定表
exp
1)将数据库ORACLE完全导出
exp sysuser/password@127.0.0.1:1521/ORCL file=D:d:\daochu.dmp full=y;
2)将数据库中WLP用户与,WLPING用户的表导出
exp username/password@127.0.0.1:1521/ORCL file=d:\daochu.dmp owner=(WLP,WLPING);
3)将数据库中的表table1、table2导出
exp sysuser/password@127.0.0.1:1521/ORCL file= d:\data\newsmgnt.dmp tables=(table1,table2);
4)将数据库中的表table1中的字段filed1以"00"打头的数据导出
exp system/manager@loaclhost:1521/orcl file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\" log=exp_export.log;
expdp
创建逻辑目录(默认为oracle用户空间下的dpdump目录)
create directory DUMP_DIR as '/oracle/DUMP_DIR';
在服务器上创建该目录,因为Oracle并不会自动创建,如果目录不存在导出会报错
- mkdir -p /oracle/DUMP_DIR
给用户授予在该目睹读取的权限
- grant read,write on directory DUMP_DIR to scott;
1)导整个数据库
expdp system/manager DIRECTORY=DUMP_DIR DUMPFILE=expdp_export.dmp FULL=y;
2)按用户导
expdp scott/tiger@localhost:1521/ora11g schemas=scott dumpfile=expdp_export.dmp DIRECTORY=DUMP_DIR;
3)并行进程parallel
expdp scott/tiger@localhost:1521/ora11g directory=DUMP_DIR dumpfile=expdp_export.dmp parallel=40 job_name=expdp40;
4)按表名导
expdp scott/tiger@localhost:1521/ora11g TABLES=emp,dept dumpfile=expdp_export.dmp DIRECTORY=DUMP_DIR;
5)按查询条件导
expdp scott/tiger@localhost:1521/ora11g directory=DUMP_DIR dumpfile=expdp_export.dmp tables=emp query='WHERE deptno=20';
6)按表空间导
expdp system/manager DIRECTORY=DUMP_DIR DUMPFILE=expdp_export.dmp TABLESPACES=temp,example;
序列
新建序列
CREATE SEQUENCE 序列名
[INCREMENT BY n] //步长 默认1 非零
[START WITH n] //开始值
[{MAXVALUE/ MINVALUE n| NOMAXVALUE}] //最大值/最小值
[{CYCLE|NOCYCLE}] //到达最大值是否循环,不循环时直接报错
[{CACHE n| NOCACHE}]; //默认20,当有大量请求时使用缓存,预先生成多个序列提供使用,断开连接后会丢失未使用的序列值,导致序号不连续。
实例:
1 create sequence seq_my_define 2 minvalue 1 3 nomaxvalue 4 start with 1 5 increment by 1 6 nocycle 7 nocache;
查询序列当前值
select seq_my_define.currval from dual;
查询下一增长值(提醒,这里虽然是查询,但序列值会改变,相当于++i):
select seq_my_define.nextval from dual;
触发器
主键自增:oracle没有主键自增选项,需要自己使用触发器实现
1 CREATE OR REPLACE TRIGGER tr_my_define 2 BEFORE INSERT ON MY_WMPS_DEFINE FOR EACH ROW 3 begin 4 select seq_my_define.nextval into:new.id from dual; 5 end;
变量使用:
例子:将序列S_BOND_POOL_TREE的当前值与数据库ID最大值统一
变量可以在定义时赋值,也可以后面再赋值。
通过select语句将查询结果赋值给变量:select 字段名 into 变量名 from 表
execute immediate 'str'; //可以使用变量拼接字符串得到语句来执行
1 DECLARE 2 n NUMBER :=0; 3 BEGIN 4 select (num - S_BOND_POOL_TREE.nextval) into n 5 from( 6 select max(to_number( node_id)) as num from XIR_TRD_J.TREE_NODE_INFO 7 ); 8 IF n = 0 then return; 9 ELSE 10 execute immediate 'alter sequence S_BOND_POOL_TREE increment by '|| n; 11 select S_BOND_POOL_TREE.nextval into n from dual; 12 execute immediate 'alter sequence S_BOND_POOL_TREE increment by 1'; 13 END IF; 14 END;