第一篇:Oracle临时表总结
Oracle临时表总结
临时表概念
临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别。它只能存储在临时表空间,而非用户的表空间。ORACLE临时表是会话或事务级别的,只对当前会话或事务可见。每个会话只能查看和修改自己的数据。
临时表语法
临时表分类
ORACLE临时表有两种类型:会话级的临时表和事务级的临时表。
1)ON COMMIT DELETE ROWS
它是临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有效,当事物提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构 以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
2)ON COMMIT PRESERVE ROWS
它表示临时表的内容可以跨事物而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
1:会话级的临时表的数据和你当前会话有关系,当前SESSION不退出的情况下,临时表中的数据就还存在,临时表的数据只有当你退出当前SESSION的时候才被截断(TRUNCATE TABLE),如下所示:
会话级别的临时表创建:
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(ID NUMBER ,NAME VARCHAR2(32))ON COMMIT PRESERVE ROWS;
或
CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT PRESERVE ROWS
AS
SELECT * FROM TEST;
操作示例:
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(ID NUMBER ,NAME VARCHAR2(32))ON COMMIT PRESERVE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;row inserted
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID
NAME
--------------------------
kerry
SQL> INSERT INTO TMP_TEST
SELECT 2, 'rouce' FROM DUAL;row inserted
SQL> ROLLBACK;
Rollback complete
SQL> SELECT * FROM TMP_TEST;
ID
NAME
--------------------------------
kerry
SQL> 2:事务级的临时表(默认),这种类型的临时表与事务有关,当进行事务提交或者事务回滚的时候,临时表的数据将自行截断,即当COMMIT或ROLLBACK时,数据就会被TRUNCATE掉,其它的特性和会话级的临时表一致。
事务级临时表的创建方法:
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(ID NUMBER ,NAME VARCHAR2(32))ON COMMIT DELETE ROWS;
或
CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(ID NUMBER ,NAME VARCHAR2(32))ON COMMIT DELETE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;row inserted
SQL> SELECT * FROM TMP_TEST;
ID
NAME
--------------------------------
kerry
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID
NAME
----------------------------------
SQL>
3:关于临时表只对当前会话或事务可见。每个会话只能查看和修改自己的数据。
用DM用户登录数据库,打开SESSION 1后,创建临时表TMP_TEST
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(ID NUMBER ,NAME VARCHAR2(32))ON COMMIT DELETE ROWS;
或
CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(ID NUMBER ,NAME VARCHAR2(32))ON COMMIT DELETE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;row inserted
SQL> SELECT * FROM TMP_TEST;
ID
NAME
-------------------------------kerry
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID
NAME
---------------------------------
SQL>
用sys用户登录数据库,打开SESSION 2
SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TMP_TEST'--时表数据
可以查到临
SELECT * FROM DM.TMP_TEST;--查不到数据,即使TMP_TEST临时表存在数据。
临时表与永久表区别
SQL> SELECT TABLE_NAME, TABLESPACE_NAME,“LOGGING”,“TEMPORARY”, DURATION, “MONITORING”
FROM DBA_TABLES WHERE TABLE_NAME IN('TMP_TEST', 'TEST');
TABLE_NAME TABLESPACE_NAME LOGGING TEMPORARY DURATION MONITORING
---------------------------------------------------------------
TEST TBS_EDS_DATA YES N YES
TMP_TEST NO Y SYS$SESSION NO
如上所示,临时表是存储在临时表空间里面的,但是上面脚本可以看出,临时表在数据字典中没有指定其表空间,临时表是NOLOGGING,DURATION为SYS$SESSION
临时表的DML操作速度比较快,但同样也是要产生 Redo Log,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少其实在应用中,往往会创建一个NOLOGGING的永久表(中间表)来保存中间数据,从而代替临时表,至于这这两者有啥优劣,真是很难说清道明(欢迎大家探讨)。
临时表用途
什么时候使用临时表?用临时表和用中间表有啥区别呢?
我觉得是在需要的时候应用,下面是David Dai关于临时表的一个应用说明,我觉得非常形象的说明了临时表的应用场景:对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。因此,对于这种案例,就可以采用创建临时表(ON COMMIT PRESERVE ROWS)的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML操作的压力。
1:当处理某一批临时数据,需要多次DML操作时(插入、更新等),建议使用临时表。
2:当某些表在查询里面,需要多次用来做连接时。(为了获取目标数据需要关联A、B、C,同时为了获取另外一个目标数据,需要关联D、B、C....)
关于临时表和中间表(NOLOGGING,保存中间数据,使用完后删除)那个更适合用来存储中间数据,我个人更倾向于使用临时表,而不建议使用中间表。
注意事项)不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。这点网上很多资料都这么说,我没有追查到底是那个版本不支持lob对象,至少在ORACLE 10g这个版本中,临时表是支持lob对象的.SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST(ID NUMBER , NAME CLOB)ON COMMIT PRESERVE ROWS;
Table created
SQL>
SQL> INSERT INTO TMP_TEST SELECT 1, 'ADF' FROM DUAL;row inserted
SQL> SELECT * FROM V$VERSION;
BANNER
--Oracle Database 10g Enterprise Edition Release 10.2.0.1.0Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0Production)不支持主外键关系)临时表不能永久的保存数据。)临时表的数据不会备份,恢复,对其的修改也不会有任何日志信息
5)临时表不会有DML 锁
DML locks are not acquired on the data of the temporary tables.The LOCK statement has no effect on a temporary table, because each session has its own private data.)尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。请见官方文档:
DML statements on temporary tables do not generate redo logs for the data changes.However, undo logs for the data and redo logs for the undo logs are generated.Data from the temporary table is automatically dropped in the case of session termination,either when the user logs off or when the session terminates abnormally such as during a session or instance failure.)临时表可以创建临时的索引、视图、触发器。)如果要DROP会话级别临时表,并且其中包含数据时,必须先截断其中的数据。否则会报错。
SQL> DROP TABLE TMP_TEST PURGE;
DROP TABLE TMP_TEST PURGE
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
SQL> TRUNCATE TABLE TMP_TEST;
Table truncated
SQL> DROP TABLE TMP_TEST PURGE;Table dropped
第二篇:Oracle 临时表总结===
Oracle 临时表总结
什么是临时表?
临时表只存在于某个会话或事务,不产生redo。
临时表主要用于一些需要缓存结果的应用中。例如,在一个学生选课系统中,学生暂时的选课表信息保存到一个临时表中,此时的选课信息只对学生自己可见,当学生确定选课内容后,系统会将临时表中的信息转存到普通表,然后自动清除临时表中的内容。
与普通表一样,临时表的结构信息也是保存到数据字典中,当第一次向临时表中插入数据后,系统机会分配对应的临时段,当事务或者session结束后,会释放临时段空间。
默认情况下,临时表中的信息是保存到用户的默认临时表空间中,也可以在创建临时表的时候指定具体的表空间
临时表中的内容只有session内可见,但是临时表的定义信息是全局可见的,可以通过以下语句查询一个表是否为临时表 查看是否为临时表以及临时表的周期(transaction delete on commit, session preserve on commit)
select table_name,LOGGING,TEMPORARY,DURATION from user_tables where TEMPORARY='Y';
MY_TEMP_TABLE
NO Y SYS$TRANSACTION PARTITION_TEST
N T_COMPRESS
YES N EMP
YES N ORIGINAL_INDEX_TAB
YES N T_UNCOMPRESS
YES N
如何创建一个临时表?
创建临时表的语句如下:
CREATE GLOBAL TEMPORARY TABLE admin_work_area
(startdate DATE, enddate DATE, class CHAR(20))
ON COMMIT DELETE ROWS;
创建临时表有两种:delete rows, preserve rows
delete rows: 表示一个事务结束后,临时表中的数据将会被自动清除
preserve rows: 表示事务结束后,依然保留临时表中的内容,直到session结束后,自动清除临时表中的内容。
delete rows 临时表示例:
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 2
(startdate DATE, 3
enddate DATE, 4
class CHAR(20))5 ON COMMIT DELETE ROWS;
Table created.SQL> insert into ADMIN_WORK_AREA values(sysdate,sysdate+100,'Math');row created.SQL> select count(*)from ADMIN_WORK_AREA;
COUNT(*)----------
SQL> commit;
Commit complete.SQL> select count(*)from ADMIN_WORK_AREA;
COUNT(*)----------
0
preserve rows 示例
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area_preserve 2(startdate DATE, 3 enddate DATE, 4 class CHAR(20))5 ON COMMIT preserve ROWS;
SQL> insert into ADMIN_WORK_AREA_preserve values(sysdate,sysdate+100,'Math');1 row created.SQL> select count(*)from ADMIN_WORK_AREA_preserve;COUNT(*)----------1 SQL> commit;Commit complete.SQL> select count(*)from ADMIN_WORK_AREA_preserve;COUNT(*)----------1 SQL> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.064bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show user USER is “USER01” SQL> select count(*)from ADMIN_WORK_AREA_preserve;COUNT(*)----------0
通过如下语句可以查询临时表的属性信息:
SQL> select table_name,LOGGING,TEMPORARY,DURATION from user_tables where TEMPORARY='Y';TABLE_NAME LOG T DURATION-------------------------------------------------MY_TEMP_TABLE NO Y SYS$TRANSACTION ADMIN_WORK_AREA NO Y SYS$TRANSACTION ADMIN_WORK_AREA_PRESERVE NO Y SYS$SESSION
临时表空间上也可以创建索引,周期与对应的临时表相同。创建临时表的索引时,确保临时表不在使用中
SQL> create index idx_temp_admin on ADMIN_WORK_AREA_preserve(startdate);create index idx_temp_admin on ADMIN_WORK_AREA_preserve(startdate)* ERROR at line 1: ORA-14452: attempt to create, alter or drop an index on temporary table already in use SQL> commit;Commit complete.SQL> insert into ADMIN_WORK_AREA_preserve values(sysdate,sysdate+100,'Math');1 row created.
第三篇:oracle创建临时表
Oracle数据库临时表管理心得
我们在创建数据表的时候,若没有特殊的指明,那么我们创建的表是一个永久的关系型表格,也就是说,这个表格中对应的数据,除非是我们显示的删除的话,表中的数据是永远都存在的。相对应的,在Oracle数据库中还有一种类型的表,叫做临时表。这个临时表跟永久表最大的区别就是表中的数据不会永远的存在。当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己会自动清
除。
1、事务临时表的管理。
(1)事务临时表的创建。
Oracle数据库根据临时表的性质不同,可以分为事务临时表与会话临时表。事务临时表是指数据只有在当前事务内有效。一般情况下,如果在创建数据表的时候,没有特殊指明这表是会话临时表的话,则该表默认为事务临时表。
我们可以以下面的语句创建事务临时表。
Create global temporary table Temp_user
(ID NUMBER(12)Primary key,name varchar2(10));
笔者建议:
这个创建临时表的语句中,虽然没有显性的指明该表是事务临时表,但是,默认的情况下,若没有指明是什么临时表的话,系统默认是事务临时表。我们要创建事务临时表时,可以不指定关键字。但是,这查看起来比较麻烦。我建议,无论在建立什么临时表,都要利用具体的关键字来显形的指明,这大家看起来都方便。一般可以利用ON COMMIT DELETE ROWS关键字来说明该表就是事务性的临时表,而不是会话性质的临时表。
(2)事务临时表数据的变化分析。
事务临时表的话,当事务结束的时候,就会清空这个事务临时表。所以,当我们在数据库临时表中插入数据后,只要事务没有提交的话,该表中的数据就会存在。但是,当事务提交以后,该表中的数据就会被删除。而且,这个变化不会在重做日志中
显示。
具体事务临时表与会话临时表有什么区别,我们在介绍完会话临时表后会详细介
绍。
2、会话临时表的管理。
会话临时表,顾名思义,是指数据只在当前会话内有效的临时表。关闭当前会话或者进行新的连接之后,数据表中的内容就会被清除。那会话临时表跟事务临时表到底有什么区别呢?我们以一个实例来看其中的区别。
(1)首先,创建一个会话临时表。
CREATE GLOBAL TEMPOPARY TABLE TEMP_USER
(ID NUMBER(12)Primary key,name varchar2(10))
ON COMMIT PRESERVE ROWS;
也就是说,会话临时表跟事务临时表的创建语法大致相同,只有最后的关键字有区别。不过两个表虽然类似,但是其内部的处理机制还是有比较大的区别。
(2)往该表中插入数据。
Insert into TEMP_USER values(1001,’victor’);
往数据库临时表中插入数据的方法,跟往普通表中插入数据的方法是一样的,都利用insert into语句进行操作。该临时表的数据在会话结束之前都是存在这个表格
中的。
(3)提交该事务并查询相关记录。
我们利用COMMIT的语句把该事务提交以后,再用SELECT查询语句进行查询。我们知道,若该表是事务临时表的话,则当该事务结束以后,该表中的内容就会被删除。但是,这是会话临时表,所以即使该事务提交了,但是,利用SELECT语句进行查询
时,仍然可以查到该条员工记录。
(4)结束当前会话,并重新连接数据库。
关闭当前会话,从新连接到数据库后,再利用SELECT语句查询时,会有什么结果呢?此时,就查不到我们刚才插入的数据。这也就是说,在关闭对话的时候,数据库系统已经把原有的数据删除了。从以上的分析我们可以看中,会话临时表与事务临时表主要的差异就在于删除数据时机的不同。事务性临时表是在事务提交的时候清除数据,而会话性临时表则是在关闭当前会话的时候清除临时表。只要当前会话没有关闭,即使事务完成了,会话临时表中的数据仍然存在,不会被清除。
3、临时表管理需要注意的地方。
临时表相对与其他表来说,是一种比较特殊的表结构,但是,作用又比较大,Oracle数据库若没有这种表的话,还真是不行。为了管理好这种特殊的表,我们需要
注意几个细节。
一是要注意临时表不能永久的保存数据。只所以称为临时表,就是因为该表中的内容只是临时存在的。当一个会话或者事务结束时,该表中的内容就会被自动清空。所以,在临时表中,一般不要保存永久数据。在实务中,有个不好的操作习惯,就是有些人在测试数据库的时候,喜欢把测试的数据放在临时数据表中。其实,这是对Oralce临时数据表认识的错误。若我们在数据库中,把要测试的数据,如销售定单的内容放在数据库的临时表中的话,则在其他功能中,如要测试销售定单日报表的功能时,就会找不到相关的定单内容。因为离开特定的会话或者事务的话,临时表中的内容就会不存在了。所以,Oralce数据库中所讲的临时表不是给我们来存储测试数据的。
二是临时表中的数据不会备份、恢复,对其的修改也不会有任何的日志信息。若我们在操作数据库的时候,往数据库的临时表中存入了一些信息。此时突然服务器出现当机。此时,我们想通过数据库备份文件恢复数据库临时表中的内容,或者查看临时表的日志信息,都是无法实现的。也就是说,当服务器以外死机重新启动后,临时表中的内容就会被清空。在数据库的任何地方,如数据库备份文件或者日志信息中,都查不到在重新启动之前数据库临时表中保存了哪些内容,就好象根本没有对临时表
进行操作一样。
三是临时表表空间的管理。临时表在Oracle数据库中,也是表的一种,其也有对应的表空间。在创建临时表的时候,若我们不指定表空间的话,默认的表空间是SYSTEM。对于临时表的表空间管理的话,我们需要注意一个小的细节。若我们把临时表的表空间归属为SYSTEM的话,也就是说,在创建临时表的时候不具体指定具体的表空间,则这个默认的表空间是不能被删除的。而若我们在创建临时表表空间的时候,指定为SYSTEM以外的表空间的话,则在不需要这表空间的时候,我们可以删除。所以,为了后续管理的方便,笔者还是建议大家在创建临时表的时候,要指定表空间。
四是要注意一个问题,临时表只是数据是临时的,而表仍然是永久的。也就是说,当一个会话结束或者一个事务完成时,其临时表中的数据虽然删除了,但是,临时表本身仍然是存在的。也就是说。Oracle数据库中的临时表表是全局的,只是数据是临时的。这跟SQL Server数据库系统具有比较大的区别。其实,这两个数据库在临时表的处理上有很大的不同,各有各的特色。在以后的文章中,我会专门叙述这两种数据库在临时表管理机制上的不同,欢迎大家关注。
五是要注意Oracle数据库在给临时表填入数据的时候,不会对相应的记录加锁。也就是说,当在临时表上执行DML语句的操作时,不会给记录加锁,也不会将数据的变化内容写到重做(REDO)日志中。所以不能用临时表保存永久的数据,也不能对临时表进行共同的操作。这是新手在管理数据库临时表经常会碰到的问题。
六是临时表与普通表之间不能相互转换。在一般情况下,临时表建立后,该表就不能被转换成永久表。所以,这也说明一个道理,利用临时表作为数据库设计时候的测试表不合适。这个临时表可能跟我们按字面意思理解的临时表有误,不是我们所认为的为了测试表结构而建立的临时表。这一点是我们在刚开始接触ORACLE数据库时,经常会犯的错误。
第四篇:Oracle临时表用法的经验心得
Oracle临时表用法的经验心得
1.案例
前段时间报表中心有一存储过程执行速度过慢,由于另外一个存储过程中用到了那个存储过程中的中间表,因此如果前面的一个过程没有执行完而执行后面的那个过程,后面的过程执行完之后还是没有数据。四月份那个过程执行大约需要两个小时的时间,本以为是过程里面的业务太复杂导致。可前段时间执行的时间超过了十小时。后来才发现是中间表中数据量越来越多导致,大约有五百多万数据,而且每天会增加两万左右的数据,慢的地方主要是在中间表中插入当天的数据之后需要更新某些字段,由于中间表中数据量过大,更新这些字段是速度才很慢(已经建了索引)。
解决方案:创建一个和中间表一摸一样的临时表,先把数据插入到临时表中,在临时表中更新需要更新的字段,更新完后再把临时表中所有的数据插入到中间表中,然后再使用中间表中的数据汇总出报表。
2.如何创建临时表
创建Oracle 临时表,可以有两种类型的临时表:会话级的临时表,事务级的临时表。2.1会话级临时表
因为这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。
即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table,即数据清空)了。会话级的临时表创建方法:
Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...)On Commit Preserve Rows ; 举例:
create global temporary table Student(Stu_id Number(5), Class_id Number(5), Stu_Name Varchar2(8), Stu_Memo varchar2(200))on Commit Preserve Rows ; 2.2 事务级临时表
事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,Oracle临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:
Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...)On Commit Delete Rows ; 举例:
create global temporary table Classes(Class_id Number(5), Class_Name Varchar2(8), Class_Memo varchar2(200))on Commit delete Rows;2.3 两种类型临时表的区别
会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit、rollback 或者是会话结束,Oracle临时表中的数据都将被截断 2.4临时表的不足之处
1)不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。)不支持主外键关系
3.示例
1.会话级临时表
create global temporary table emp_temp_preserve on commit preserve rows
as select * from emp where 1=2;
insert into emp_temp_preserve select * from emp;commit;
select * from emp_temp_preserve;
在同一个会话中查询有数据,不在同一个会话中查询没数据
在不同会话中查询:
2.事务级临时表
create global temporary table emp_temp_delete on commit delete rows
as select * from emp where 1=2;
insert into emp_temp_delete select * from emp;commit;提交之后再同一个会话中查询,没有数据,说明提交之后临时表中的数据已清空,提交之前查询时是有数据的,select * from emp_temp_delete;
第五篇:Oracle建表空间各种语句
在创建用户之前,先要创建表空间:
其格式为:格式: create tablespace 表间名 datafile '数据文件名' size 表空间大小;如:
SQL> create tablespace news_tablespace datafile 'F:oracleproduct10.1.0oradatanewsnews_data.dbf' size 500M;其中'news_tablespace'是你自定义的表空间名称,可以任意取名;'F:oracleproduct10.1.0oradatanewsnews_data.dbf'是数据文件的存放位置,'news_data.dbf'文件名也是任意取;'size 500M'是指定该数据文件的大小,也就是表空间的大小。
现在建好了名为'news_tablespace'的表空间,下面就可以创建用户了:
其格式为:格式: create user 用户名 identified by 密码 default tablespace 表空间表;如:
SQL> create user news identified by news default tablespace news_tablespace;默认表空间'default tablespace'使用上面创建的表空间。
接着授权给新建的用户:
SQL> grant connect,resource to news;--表示把 connect,resource权限授予news用户
SQL> grant dba to news;--表示把 dba权限授予给news用户
授权成功。
ok!数据库用户创建完成,现在你就可以使用该用户创建数据表了!1.建表空间
create tablespace hoteldata datafile 'D:javaOracleproduct10.1.0oradatazznorclhoteldata.dbf'size 200m autoextend on next 10m maxsize unlimited;2.建用户 create user hotel identified by hotel default tablespace hoteldata account unlock;//identified by 后面的是密码,前面的是用户名 3.用户授权
grant resource,connect,RECOVERY_CATALOG_OWNER to hotel;grant create table to hotel;alter user hotel quota unlimited ON OSDB;alter user hotel default tablespace hoteldata;4.删除表空间
DROP TABLESPACE hoteldata INCLUDING CONTENTS AND DATAFILES;5.删除用户
DROP USER hotel CASCADE 6.删除表的注意事项
在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。oracle sqlplus脚本建库总结(原创)******************************************************************/--查询表空间参数
select tablespace_name,min_extents,max_extents,pct_increase,status from dba_tablespaces;--查询数据文件信息
--autoextensible数据库已满后是否自动扩展
select tablespace_name,bytes,autoextensible,file_name from dba_data_files;/******************************************************************/--创建表空间
--一般信息
--DATAFILE:数据文件目录--存储
--AUTOEXTEND:数据文件满后自动扩展--ON NEXT:增量
--MAXSIZE UNLIMITED:最大容量无限制--SIZE:文件大小--存储
--启用事件记录:LOGGING为生成从做日志并可恢复,NOLOGGING为快速更新不生成日志且不可恢复
--MANAGEMENT LOCAL:本地管理--缺省:自动分配
--UNIFORM SIZE:统一分配
--MANAGEMENT DICTIONARY:在字典中管理--DEFAULT STORAGE:覆盖默认区值--INITIAL:初始大小--NEXT :下一个大小--MINEXTENTS:最小数量
--MAXEXTENTS UNLIMITED :最大数量不限制--PCTINCREASE:增量,单位“%”--MINIMUM EXTENT:最小区大小 CREATE TABLESPACE “TEST” NOLOGGING DATAFILE 'G:ORACLEORADATAMYORACLETEST.ora' SIZE 5M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 12K;--最好写成相对路径,免得出错 CREATE TABLESPACE “TEST” NOLOGGING DATAFILE '../DATABASE/TEST.ora' SIZE 5M REUSE--建议用'../oradata/TEST.ora' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 12K;CREATE TABLESPACE “TEST” LOGGING DATAFILE 'G:ORACLEORADATAMYORACLETEST.ora' SIZE 5M EXTENT MANAGEMENT DICTIONARY DEFAULT STORAGE(INITIAL 1K NEXT 2K MINEXTENTS 5 MAXEXTENTS 67 PCTINCREASE 4)MINIMUM EXTENT 3K;/******************************************************************/--增加表空间, 注意这里test.ora1不能与原表空间文件名称相同--添加一个新的大小为5M数据库文件test.ora1 alter tablespace mytesttablespace add datafile 'c:testtest.ora1' size 5M;/******************************************************************/--修改表空间数据库文件属性,myoracle为sid--将test.ora1数据库文件改为3M,其中resize可以是ONLINE, OFFLINE, RESIZE, AUTOEXTEND 或 END/DROP alter database myoracle datafile 'c:testtest.ora1' resize 3M;alter database myoracle datafile '$ORACLE_HOME/oradata/undo102.dbf' autoextend on next 10m maxsize 500M;/******************************************************************/ /*删除表空间
语法:drop tablespace tablespace_name including contents and datafiles;删除表空间时要系统不会删除表空间数据库文件,要彻底删除要手动删除 */ drop tablespace mytesttablespace including contents and datafiles;/******************************************************************/--创建用户--命令:
--CREATE USER 名称 IDENTIFIED BY 口令 DEFAULT TABLESPACE “默认表空间名” TEMPORARY TABLESPACE “TEMP” ACCOUNT UNLOCK--一般属性
--DEFAULT TABLESPACE :默认表空间名
--TEMPORARY TABLESPACE :临时表空间名,默认TEMP--ACCOUNT :用户状态,默认UNLOCK 未锁定;LOCK 锁定 CREATE USER “TEST” PROFILE “DEFAULT” IDENTIFIED BY “test” DEFAULT TABLESPACE “TEST” TEMPORARY TABLESPACE “TEMP” ACCOUNT UNLOCK;--可以写成
CREATE USER “TEST” PROFILE “DEFAULT” IDENTIFIED BY “test” DEFAULT TABLESPACE “TEST”;/******************************************************************/--用户授权
--grant “connect,resource,dba” to “someuser” with admin option;--WITH ADMIN OPTION :管理选项--授予usertest DBA权限
grant dba to “usertest” with admin option;--取消授权
--REVOKE “RESOURCE” FROM “SCOTT”;/******************************************************************/--建表
--在usertest方案下建表,注意表名不能用关键字,否则报错ORA-00903: 表名无效
--语法:
--create table [schema.]
--data type:表示字段的数据类型
--default
CREATE TABLE “TEST”.“TEST”(“ID” NUMBER(10)DEFAULT 0 PRIMARY KEY, “NAME” VARCHAR2(20)NOT NULL, “INFO” VARCHAR2(1000))TABLESPACE “TEST”;/******************************************************************/--插入数据--语法:
--INSERT INTO tablename(column1,column2,…)VALUES(expression1,expression2,…);
INSERT INTO “TEST”.“TEST”(“ID” ,“NAME” ,“INFO”)VALUES(1 ,'testname' ,'');--也可以写成
INSERT INTO “TEST”.“TEST” VALUES(1 ,'testname' ,'');/******************************************************************/