1、 Oracle的系统常用表
- 场景:用最多的场景如:
代码生成器开发
或写SQL脚本语句创建表或索引、视图、写存储过程、改变表结构(扩展字段,修改字段,修改字段长度)
等。
表名 | 表描述(作用) |
---|---|
user_tables | 可查询当前用户的表 |
all_tables | 可查询所有用户的表 |
dba_tables | 可查询包括系统表在内的所有表 |
user_users | 描述当前用户 |
all_users | 列出数据库中对当前用户可见的所有用户 |
dba_users | 描述数据库中所有用户 |
user_tab_columns | 获取用户表的所有字段还有字段的属性 |
all_tab_columns | 获取用户表的所有字段还有字段的属性 |
dba_tab_columns | 获取用户表的所有字段还有字段的属 |
user_tab_comments | 获取表注释 |
user_col_comments | 获取字段注释 |
user_indexes | 查询出用户所有表的索引 |
user_ind_columns | 查询表的索引 |
user_cons_columns | 查询表的主键 |
user_constraints | 查找表的外键 |
user_cons_columns | 查询外键约束的列名 |
dba_data_files 、dba_tablespaces | 查看数据库中所有的表空间 |
dba_tables | 指定用户所拥有的表空间(已经使用了哪些表空间) |
2、语法SQL使用
--第一种方法: 查询dba_tab_columns
select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where table_name =upper('表名') order by COLUMN_NAME
--这种方法需要有DBA权限
--第二种方法: 查询 user_tab_cols
select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_cols where table_name=upper('表名')
order by COLUMN_NAME
--这种方法只能查找当前用户下的表
--第三种方法: 查询ALL_TAB_COLUMNS
select distinct COLUMN_NAME,DATA_TYPE,DATA_LENGTH
from ALL_TAB_COLUMNS
WHERE TABLE_NAME= upper('表名')
--这种方法可以查询所有用户下的表
---------------------------补充-------------------------------------------------------------
--增加cw_srcbpb表字段
alter table cw_srcbpb add (SRCBPB_RJBPBL varchar2(100) );
--修改cw_srcbpb表字段
alter table cw_srcbpb modify (SRCBPB_RJBPBL number(30,3) );
--Oracle查看所有表和字段
--获取表:
select table_name from user_tables; --当前用户的表
select table_name from all_tables; --所有用户的表
select table_name from dba_tables; --包括系统表
select table_name from dba_tables where owner='LBSP'; --获取用户***所拥有的表这里的用户名要记得是用大写的。
-- 获取表字段:其实这里是根据用户的权限来获取字段的属性(表名要大写)
select * from user_tab_columns where Table_Name='用户表';--获取用户表的所有字段还有字段的属性。
select * from all_tab_columns where Table_Name='用户表';--获取用户表的所有字段还有字段的属性。
select * from dba_tab_columns where Table_Name='用户表';--获取用户表的所有字段还有字段的属性。
--获取表注释:
select * from user_tab_comments
--user_tab_comments:table_name,table_type,comments
--相应的还有dba_tab_comments,all_tab_comments,这两个比user_tab_comments多了ower列。
--获取字段注释:
select * from user_col_comments
--user_col_comments:table_name,column_name,comments
--相应的还有dba_col_comments,all_col_comments,这两个比user_col_comments多了ower列。
--查询出用户所有表的索引
select * from user_indexes
--查询用户表的索引(非聚集索引):
select * from user_indexes where uniqueness='NONUNIQUE'
--查询用户表的主键(聚集索引):
select * from user_indexes where uniqueness='UNIQUE'
--查询表的索引
select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and
t.table_name='NODE'
--查询表的主键
select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and
au.constraint_type = 'P' AND cu.table_name = 'NODE'
--查找表的唯一性约束(包括名称,构成列):
select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name=au.constraint_name and
cu.table_name='NODE'
--查找表的外键
select * from user_constraints c where c.constraint_type = 'R' and c.table_name='STAFFPOSITION';
--查询外键约束的列名:
select * from user_cons_columns cl where cl.constraint_name = '外键名称';
--查询引用表的键的列名:
select * from user_cons_columns cl where cl.constraint_name = '外键引用表的键名';
--删除表空间
drop tablespace AHTBSPACETEST including contents and datafiles cascade constraints
--查询当前索引的状态:
select distinct index_name,table_owner,table_name,status from user_indexes
3、结合声明声明式高级用法
3.1 创建表:以T_CLASS班级表和T_STUDENT学生表为主
- 关键字: 执行 、即时(马上) 、开始 、结束、如果 、结束语句 关键字的使用,而commit一般SQL脚本只有一个
- 函数:转换小写
- 系统表:user_tables
- 注意:结束以 【/ 斜杆】结束
declare
iCnt number := 0;
begin
select count(*) into iCnt from user_tables where lower(table_name) = lower('T_CLASS');
if iCnt = 0 then -- 如果查询不到这个表就创建这个表
execute immediate 'create table T_CLASS
(
CLASS_ID NUMBER(11) NOT NULL ,
CLASS_NAME VARCHAR2(50) NOT NULL,
CLASS_NO VARCHAR2(30) NOT NULL,
CLASS_NUM NUMBER(10) NOT NULL
)';
--- 对表和表属性加标注
execute immediate 'comment on table T_CLASS is ''班级表''';
execute immediate 'alter table T_CLASS add constraint PK_CLASS_ID primary key (CLASS_ID)' ;
execute immediate 'comment on column T_CLASS.CLASS_NAME is ''班级名称''';
execute immediate 'comment on column T_CLASS.CLASS_NO is ''班级编号''';
execute immediate 'comment on column T_CLASS.CLASS_NUM is ''班级人数''';
end if;
end;
/
declare
iCnt number := 0;
begin
select count(*) into iCnt from user_tables where lower(table_name) = lower('T_STUDENT');
if iCnt = 0 then -- 如果查询不到这个表就创建这个表
execute immediate 'create table T_STUDENT
(
USER_ID NUMBER(11) NOT NULL ,
ID_CARD_CODE VARCHAR2(50) NOT NULL,
USER_NAME VARCHAR2(30) NOT NULL,
PASS_WORD VARCHAR2(30) NOT NULL,
AGE NUMBER(10) NOT NULL,
ADDRESS VARCHAR2(255) ,
CREATE_TIME DATE
)';
execute immediate 'comment on table T_STUDENT is ''学生用户表''';
execute immediate 'alter table T_STUDENT add constraint PK_USER_ID primary key (USER_ID)' ;
execute immediate 'comment on column T_STUDENT.ID_CARD_CODE is ''身份证编号''';
execute immediate 'comment on column T_STUDENT.USER_NAME is ''用户名''';
execute immediate 'comment on column T_STUDENT.PASS_WORD is ''用户密码''';
execute immediate 'comment on column T_STUDENT.AGE is ''年龄''';
execute immediate 'comment on column T_STUDENT.ADDRESS is ''地址''';
execute immediate 'comment on column T_STUDENT.CREATE_TIME is ''创建时间''';
end if;
end;
/
3.2 创建索引
- 关键字: 、
- 系统表: user_ind_columns
--对学生表的身份证ID加唯一索引ID_CARD_CODE
declare
iCnt number := 0;
begin
select count(*) into iCnt from user_ind_columns where lower(index_name) = lower('stu_idx_card_code') and lower(table_name)=lower('T_STUDENT');
if iCnt = 0 then
execute immediate 'create unique index stu_idx_card_code on T_STUDENT(id_card_code)';
end if;
end;
/
--创建学生表序列Id
declare
iCount integer;
begin
select count(*) into iCount from user_sequences where upper(sequence_name)=upper('SQ_T_STUDENT');
if iCount = 0 then
execute immediate
'create sequence SQ_T_STUDENT
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache';
end if;
end;
/
3.3 删除索引
- 关键字: 、
- 系统表: user_ind_columns
--删除T_STUDENT的唯一索引
declare
iCnt number := 0;
begin
select count(*) into iCnt from user_ind_columns where lower(index_name) = lower('stu_idx_card_code') and lower(table_name)=lower('T_STUDENT');
if iCnt > 0 then
execute immediate 'drop index stu_idx_card_code ';
end if;
end;
/
--删除学生表序列Id
declare
iCount integer;
begin
select count(*) into iCount from user_sequences where upper(sequence_name)=upper('SQ_T_STUDENT');
if iCount > 0 then
execute immediate 'drop sequence SQ_T_STUDENT ';
end if;
end;
/
3.4 创建视图与删除视图
- 关键字: 、 、 、
- 系统表: all_views
--传统创建视图脚本
CREATE OR REPLACE VIEW V_STUDENT AS
SELECT
user_id,
user_name ,
pass_word ,
age,
create_time,
id_card_code
FROM T_STUDENT
WITH READ ONLY; --只读视图
--声明式删除视图
declare
iCnt number := 0;
begin
SELECT count(*) into iCnt FROM all_views where upper(view_name)=upper('V_STUDENT');
if iCnt > 0 then
execute immediate 'drop VIEW V_STUDENT ';
end if;
end;
/
--声明式创建视图脚本,WITH READ ONLY表示只读视图
declare
iCnt number := 0;
begin
SELECT count(*) into iCnt FROM all_views where upper(view_name)=upper('V_STUDENT');
if iCnt = 0 then
execute immediate 'CREATE OR REPLACE VIEW V_STUDENT AS
SELECT
user_id,
user_name ,
pass_word ,
age,
create_time,
ID_CARD_CODE
FROM T_STUDENT
WITH READ ONLY
';
end if;
end;
/
4、创建用户
- 四步曲 :(其中文件位置、文件大小、自增量、命名之类可按需自定义)
- 1、 创建临时表空间:
create temporary tablespace MyTestSpace_Temp tempfile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SEAN_TEMP01.DBF'size 10m autoextend on next 10m maxsize 100m extent management local
- 2 、创建数据表空间:
create tablespace mytest_data logging datafile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SEAN_DATA01.DBF' size 10m autoextend on next 10m maxsize 100m extent management local
- 3 、创建用户并指定表空间:
create tablespace mytest_data logging datafile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SEAN_DATA01.DBF' size 10m autoextend on next 10m maxsize 100m extent management local
- 4 、给用户授予权限:
grant connect,resource,dba to mytest
5、Oracle权限与改表空间
- 1、给用户赋予DBA权限:
grant dba to mytest
- 2、撤销用户对所有表空间都可使用的权限(相当于撤销用户在表空间上的DBA权限):
revoke unlimited tablespace from mytest
- 3 将用户在SYSTEM表空间的配额置为0:
alter user mytest quota 0 on SYSTEM
*4 设置用户在mytest_data 表空间上配额不受限
alter user mytest quota unlimited on mytest_data ;
- 5、修改表空间:
alter table TD_USERS move tablespace TABLESPACE_A // 第一步:将表TD_USERS移至表空间tablesapce_A下
alter index TD_USERS_ID rebuild tablespace TABLESPACE_A // 第二步:修改该表的索引的表空间