Oracle数据库数据对象中最基本的是表和视图,其他还有约束、序列、函数、存储过程、包、触发器等。对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径。 表和视图 Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更强大。视图是一个或多个表中数据的逻辑表达式。本文我们将讨论怎样创建和管理简单的表和视图。 管理表 表可以看作有行和列的电子数据表,表是关系数据库中一种拥有数据的结构。用CREATE TABLE语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。例如:
这样我们就建立了一个名为products的表, 关键词CREATE TABLE后紧跟的表名,然后定义了三列,同时规定了列的数据类型和大小。 在创建表的同时你可以规定表的完整性约束,也可以规定列的完整性约束,在列上普通的约束是NOT NULL,关于约束的讨论我们在以后进行。 在建立或更改表时,可以给表一个缺省值。缺省值是在增加行时,增加的数据行中某一项值为null时,oracle即认为该值为缺省值。 下列数据字典视图提供表和表的列的信息: . DBA_TABLES . DBA_ALL_TABLES . USER_TABLES . USER_ALL_TABLES . ALL_TABLES . ALL_ALL_TABLES . DBA_TAB_COLUMNS . USER_TAB_COLUMNS . ALL_TAB_COLUMNS 表的命名规则 表名标识一个表,所以应尽可能在表名中描述表,oracle中表名或列名最长可以达30个字符串。表名应该以字母开始,可以在表名中包含数字、下划线、#、$等。 从其它表中建立表 可以使用查询从基于一个或多个表中建立表,表的列的数据类型和大小有查询结果决定。建立这种形式的表的查询可以选择其他表中所有的列或者只选择部分列。在CREATE TABLE语句中使用关键字AS,例如:
需要注意的是如果查询涉及LONG数据类型,那么CREATE TABLE....AS SELECT....将不会工作。 更改表定义 在建立表后,有时候我们可能需要修改表,比如更改列的定义,更改缺省值,增加新列,删除列等等。ORACLE使用ALTER TABLE语句来更改表的定义 1、增加列 语法:
例:
对于已经存在的数据行,新列的值将是NULL. 2、更改列 语法:
例:
这个例子中我们修改了表orders,将STATUS列的长度增加到15,将QUANTITY列减小到10,3; 修改列的规则如下: . 可以增加字符串数据类型的列的长度,数字数据类型列的精度。 . 减少列的长度时,该列应该不包含任何值,所有数据行都为NULL. . 改变数据类型时,该列的值必须是NULL. . 对于十进制数字,可以增加或减少但不能降低他的精度。 3、删除数据列 优化ORACLE数据库,唯一的方法是删除列,重新建立数据库。在ORACLE8i中有很多方法删除列,你可以删除未用数据列或者可以标示该列为未用数据列然后删除。 删除数据列的语法是:
要注意的是在删除列时关于该列的索引和完整性约束也同时删除。注意关键字CASCADE CONSTRAINS,如果删除的列是多列约束的一部分,那么这个约束条件相对于其他列也同时删除。 如果用户担心在大型数据库中删除列要花太多时间,可以先将他们标记为未用数据列,标记未用数据列的语法如下:
这个语句将一个或多个数据列标记为未用数据列,但并不删除数据列中的数据,也不释放占用的磁盘空间。但是,未用数据列在视图和数据字典中并不显示,并且该数据列的名称将被删除,新的数据列可以使用这个名称。基于该数据列的索引、约束,统计等都将被删除。 删除未用数据列的语句是:
|
||||||||||
删除表和更改表名
删除表后,表上的索引、触发器、权限、完整性约束也同时删除。ORACLE不能删除视图,或其他程序单元,但oracle将标示他们无效。如果删除的表涉及引用主键或唯一关键字的完整性约束时,那么DROP TABLE语句就必须包含CASCADE CONSTRAINTS子串。 更改表名 RENAME命令用于给表和其他数据库对象改名。ORACLE系统自动将基于旧表的完整性约束、索引、权限转移到新表中。ORACLE同时使所有基于旧表的数据库对象,比如视图、程序、函数等,为不合法。 语法:
例:
截短表 TRUNCATE命令与DROP命令相似, 但他不是删除整个数据表,所以索引、完整性约束、触发器、权限等都不会被删除。缺省情况下将释放部分表和视图空间,如果用户不希望释放表空间,TRUNCATE语句中要包含REUSE STORAGE子串。TRUNCATE命令语法如下:
例:
管理视图 视图是一个或多个表中的数据的简化描述,用户可以将视图看成一个存储查询(stored query)或一个虚拟表(virtual table).查询仅仅存储在oracle数据字典中,实际的数据没有存放在任何其它地方,所以建立视图不用消耗其他的空间。视图也可以隐藏复杂查询,比如多表查询,但用户只能看见视图。视图可以有与他所基于表的列名不同的列名。用户可以建立限制其他用户访问的视图。 建立视图 CREATE VIEW命令创建视图,定义视图的查询可以建立在一个或多个表,或其他视图上。查询不能有FOR UPDATE子串,在早期的ORACLE8i版本中不支持ORDER BY子串,现在的版本中CREATE VIEW可以拥有ORDER BY子串。 例:
用户可以在创建视图的同时更改列名,方法是在视图名后立即加上要命名的列名。重新定义视图需要包含OR REPLACE子串。
如果在创建的视图包含错误在正常情况下,视图将不会被创建。但如果你需要创建一个带错误的视图必须在CREATE VIEW语句中带上FORCE选项。如:
这样将创建了一个名为ORDER_STATUS的视图,但这样的视图的状态是不合法的,如果以后状态发生变化则可以重新编译,其状态也变成合法的。 从视图中获得数据 从视图中获得数据与从表中获得数据基本一样,用户可以在连接和子查询中使用视图,也可以使用SQL函数,以及所有SELECT语句的字串。 插入、更新、删除数据 用户在一定的限制条件下可以通过视图更新、插入、删除数据。如果视图连接多个表,那么在一个时间里只能更新一个表。所有的能被更新的列可以在数据字典USER_UPDATETABLE_COLUMNS中查到。 用户在CREATE VIEW中可以使用了WITH子串。WITH READ ONLY子串表示创建的视图是一个只读视图,不能进行更新、插入、删除操作。WITH CHECK OPTION表示可以进行插入和更新操作,但应该满足WHERE子串的条件。这个条件就是创建视图WHERE子句的条件,比如在上面的例子中用户创建了一个视图TOP_EMP,在这个视图中用户不能插入salary小于2000的数据行。 删除视图 删除视图使用DROP VIEW命令。同时将视图定义从数据字典中删除,基于视图的权限也同时被删除,其他涉及到该视图的函数、视图、程序等都将被视为非法。 例:
|
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name; |
ALTER TABLE policies DISABLE CONSTRAINT chk_gender |
ALTER TABLE policies ENABLE CONSTRAINT chk_gender |
ALTER TABLE table_name DROP CONSTRAINT constraint_name |
ALTER TABLE policies DROP CONSTRAINT chk_gender; |
CONSTRAINT [constraint_name] CHECK (condition); |
CREATE TABLE policies (policy_id NUMBER, holder_name VARCHAR2(40), gender VARCHAR2(1) constraint chk_gender CHECK (gender in ('M','F'), marital_status VARCHAR2(1), date_of_birth DATE, constraint chk_marital CHECK (marital_status in('S','M','D','W')) ); |
CREATE TABLE policies (policy_id NUMBER, holder_name VARCHAR2(40) NOT NULL, gender VARCHAR2(1), marital_status VARCHAR2(1), date_of_birth DATE NOT NULL ); |
ALTER TABLE policies MODIFY holder_name NOT NULL |
column_name data_type CONSTRAINT constraint_name UNIQUE |
CONSTRAINT constraint_name (column) UNIQUE USING INDEX TABLESPACE (tablespace_name) STORAGE (stored clause) |
CREATE TABLE insured_autos (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY, vin VARCHAR2(10), coverage_begin DATE, coverage_term NUMBER, CONSTRAIN unique_auto UNIQUE (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0) ); |
ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name; |
ALTER TABLE insured_autos DROP CONSTRAIN unique_name; |
CREATE TABLE policies (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY, holder_name VARCHAR2(40), gender VARCHAR2(1), marital_status VARCHAR2(1), date_of_birth DATE ); |
CREATE TABLE insured_autos (policy_id NUMBER, vin VARCHAR2(40), coverage_begin DATE, coverage_term NUMBER, CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0) ); |
ALTER TABLE policies DROP PRIMARY KEY; |
ALTER TABLE policies DISABLE PRIMARY KEY; |
CREATE TABLE insured_autos (policy_id NUMBER CONSTRAINT policy_fk REFERENCE policies(policy_id ON DELETE CASCADE, vin VARCHAR2(40), coverage_begin DATE, coverage_term NUMBER, make VARCHAR2(30), model VARCHAR(30), year NUMBER, CONSTRAIN auto_fk FROEIGN KEY (make,model,year) REFERENCES automobiles (make,model,year) ON DELETE SET NULL ); |
MAKE | MODEL | YEAR |
Ford | Taurus | 2000 |
Toyota | Camry | 1999 |
POLICY_ID | MAKE | MODEL | YEAR |
576 | Ford | Taurus | 2000 |
577 | Toyota | Camry | 1999 |
578 | Tucker | NULL | 1949 |
SET CONSTRAINT constraint_name|ALL DEFEERRED|IMMEDIATE --; |
CREATE SEQUENCE [schema] sequence KEYWORD |
KEYWORD | 描述 |
START WITH | 定义序列生成的第一个数字,缺省为1 |
INCREMENT BY | 定义序列号是上升还是下降,对于一个降序的序列INCREMENT BY为负值 |
MINVALUE | 定义序列可以生成的最小值,这是降序序列中的限制值。缺省情况下该值为NOMINVALUE,NOMINVALUE,对于升序为1,对于降序为-10E26. |
MAXVALUE | 序列能生成的最大数字。这是升序序列中的限制值,缺省的MAXVALUE为NOMAXVALUE,NOMAXVALUE,对于升序为10E26,对于降序为-1。 |
CYCLE | 设置序列值在达到限制值以后可以重复 |
NOCYCLE | 设置序列值在达到限制值以后不能重复,这是缺省设置。当试图产生MAXVALUE+1的值时,将会产生一个异常 |
CACHE | 定义序列值占据的内存块的大小,缺省值为20 |
NOCACHE | 在每次序列号产生时强制数据字典更新,保证在序列值之间没有间隔当创建序列时,START WITH值必须等于或大于MINVALUE。 |
DROP SEQUENCE sequence_name |
CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] object[@db_link]; |
CREATE PUBLIC SYNONYM policies FOR poladm.policies@prod; CREATE SYNONYM plan_table FOR system.plan_table; |
CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name [parameter_lister] {AS|IS} declaration_section BEGIN executable_section [EXCEPTION exception_section] END [procedure_name] |
CREATE [ OR REPLACE] FINCTION [schema.]function_name [parameter_list] RETURN returning_datatype {AS|IS} declaration_section BEGIN executable_section [EXCEPTION] exception_section END [procedure_name] |
CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER) RETURN NUMBER IS pi NUMBER=ACOS(-1); RadiansPerDegree NUMBER; BEGIN RadiansPerDegree=pi/180; RETURN(SIN(DegreesIn*RadiansPerDegree)); END |
CREATE [OR REPLACE] PACKAGE package_name {AS|IS} public_variable_declarations | public_type_declarations | public_exception_declarations | public_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
CREATE [OR REPLACE] PACKAGE BODY package_name {AS|IS} private_variable_declarations | private_type_declarations | private_exception_declarations | private_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
事件 | 触发器描述 |
INSERT | 当向表或视图插入一行时触发触发器 |
UPDATE | 更新表或视图中的某一行时触发触发器 |
DELETE | 从表或视图中删除某一行时触发触发器 |
CREATE | 当使用CREATE语句为数据库或项目增加一个对象时触发触发器 |
ALTER | 当使用ALTER语句为更改一个数据库或项目的对象时触发触发器 |
DROP | 当使用DROP语句删除一个数据库或项目的对象时触发触发器 |
START | 打开数据库时触发触发器,在事件后触发 |
SHUTDOWN | 关闭数据库时触发,事件前触发 |
LOGON | 当一个会话建立时触发,事件前触发 |
LOGOFF | 当关闭会话时触发,事件前触发 |
SERVER | 服务器错误发生时触发触发器,事件后触发 |
CREATE [OR REPLACE] TRIGGER trigger_name {before|after|instead of} event ON {table_or_view_name|DATABASE} [FOR EACH ROW[WHEN condition]] trigger_body |
ALTER TRIGGER trigger_name ENABLE; ALTER TRIGGER trigger_name DISABLE; |
ALTER TRIGGER table_name DISABLE ALL TRIGGER; ALTER TRIGGER table_name ENABLE ALL TRIGGER; |
DROP TRIGGER trigger_name; |
视图家族(View Family) | 描述 |
COL_PRIVS | 包含了表的列权限,包括授予者、被授予者和权限 |
EXTENTS | 数据范围信息,比如数据文件,数据段名(segment_name)和大小 |
INDEXES | 索引信息,比如类型、唯一性和被涉及的表 |
IND_COLUMNS | 索引列信息,比如索引上的列的排序方式 |
OBJECTS | 对象信息,比如状态和DDL time |
ROLE_PRIVS | 角色权限,比如GRANT和ADMIN选项 |
SEGMENTS | 表和索引的数据段信息,比如tablespace和storage |
SEQUECNCES | 序列信息,比如序列的cache、cycle和ast_number |
SOURCE | 除触发器之外的所有内置过程、函数、包的源代码 |
SYNONYMS | 别名信息,比如引用的对象和数据库链接db_link |
SYS_PRIVS | 系统权限,比如grantee、privilege、admin选项 |
TAB_COLUMNS | 表和视图的列信息,包括列的数据类型 |
TAB_PRIVS | 表权限,比如授予者、被授予者和权限 |
TABLES | 表信息,比如表空间(tablespace),存储参数(storage parms)和数据行的数量 |
TRIGGERS | 触发器信息,比如类型、事件、触发体(trigger body) |
USERS | 用户信息,比如临时的和缺省的表空间 |
VIEWS | 视图信息,包括视图定义 |
VIEW NAME | 描述 |
USER_COL_PRIVS_MADE | 用户授予他人的列权限 |
USER_COL_PRIVS_RECD | 用户获得的列权限 |
USER_TAB_PRIVS_MADE | 用户授予他人的表权限 |
USER_TAB_PRIVS_RECD | 用户获得的表权限 |
SELECT 'ALTER USER'||username|| 'TEMPORARY TABLESPACE temp;' FROM DBA_USERS WHERE username<>'SYS' AND temporary_tablespace<>'TEMP'; |
ALTER USER SYSTEM TEMPORARY TABLESPACE temp; ALTER USER OUTLN TEMPORARY TABLESPACE temp; ALTER USER DBSNMP TEMPORARY TABLESPACE temp; ALTER USER SCOTT TEMPORARY TABLESPACE temp; ALTER USER DEMO TEMPORARY TABLESPACE temp; |