|Oracle® Database Administrator's Guide
11g Release 2 (11.2)
Part Number E17120-05
To create a new table in your schema, you must have the
CREATE TABLE system privilege. To create a table in another user's schema, you must have the
CREATE ANY TABLE system privilege. Additionally, the owner of the table must have a quota for the tablespace that contains the table, or the
UNLIMITED TABLESPACE system privilege.
This section contains the following topics:
See Also:Oracle Database SQL Language Reference for exact syntax of the
CREATE TABLEand other SQL statements discussed in this chapter
When you issue the following statement, you create a table named
admin_emp in the
hr schema and store it in the
CREATE TABLE hr.admin_emp ( empno NUMBER(5) PRIMARY KEY, ename VARCHAR2(15) NOT NULL, ssn NUMBER(9) ENCRYPT USING 'AES256', job VARCHAR2(10), mgr NUMBER(5), hiredate DATE DEFAULT (sysdate), photo BLOB, sal NUMBER(7,2), hrly_rate NUMBER(7,2) GENERATED ALWAYS AS (sal/2080), comm NUMBER(7,2), deptno NUMBER(3) NOT NULL CONSTRAINT admin_dept_fkey REFERENCES hr.departments (department_id)) TABLESPACE admin_tbs STORAGE ( INITIAL 50K); COMMENT ON TABLE hr.admin_emp IS 'Enhanced employee table';
Note the following about this example:
Integrity constraints are defined on several columns of the table.
STORAGE clause specifies the size of the first extent. See Oracle Database SQL Language Reference for details on this clause.
Encryption is defined on one column (
ssn), through the transparent data encryption feature of Oracle Database. The Oracle Wallet must therefore be open for this
TABLE statement to succeed.
photo column is of data type
BLOB, which is a member of the set of data types called large objects (LOBs). LOBs are used to store semi-structured data (such as an XML tree) and unstructured data (such as the stream of bits in a color image).
One column is defined as a virtual column (
hrly_rate). This column computes the employee's hourly rate as the yearly salary divided by 2,080. See Oracle Database SQL Language Reference for a discussion of rules for virtual columns.
COMMENT statement is used to store a comment for the table. You query the
*_TAB_COMMENTS data dictionary views to retrieve such comments. See Oracle Database SQL Language Reference for more information.
Oracle Database SQL Language Reference for a description of the datatypes that you can specify for table columns
Oracle Database Advanced Security Administrator's Guide for information about transparent data encryption and the Oracle Wallet
Oracle Database SecureFiles and Large Objects Developer's Guide for more information about LOBs.
Temporary tables are useful in applications where a result set is to be buffered (temporarily persisted), perhaps because it is constructed by running multiple DML operations. For example, consider the following:
A Web-based airlines reservations application allows a customer to create several optional itineraries. Each itinerary is represented by a row in a temporary table. The application updates the rows to reflect changes in the itineraries. When the customer decides which itinerary she wants to use, the application moves the row for that itinerary to a persistent table.
During the session, the itinerary data is private. At the end of the session, the optional itineraries are dropped.
The definition of a temporary table is visible to all sessions, but the data in a temporary table is visible only to the session that inserts the data into the table.
CREATE GLOBAL TEMPORARY TABLE statement to create a temporary table. The
ON COMMIT clause indicates if the data in the table is transaction-specific (the default) or session-specific, the implications of which are as follows:
|ON COMMIT Setting||Implications|
||This creates a temporary table that is transaction specific. A session becomes bound to the temporary table with a transactions first insert into the table. The binding goes away at the end of the transaction. The database truncates the table (delete all rows) after each commit.|
||This creates a temporary table that is session specific. A session gets bound to the temporary table with the first insert into the table in the session. This binding goes away at the end of the session or by issuing a
This statement creates a temporary table that is transaction specific:
CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS;
Indexes can be created on temporary tables. They are also temporary and the data in the index has the same session or transaction scope as the data in the underlying table.
By default, rows in a temporary table are stored in the default temporary tablespace of the user who creates it. However, you can assign a temporary table to another tablespace upon creation of the temporary table by using the
TABLESPACE clause of
CREATE GLOBAL TEMPORARY TABLE. You can use this feature to conserve space used by temporary tables. For example, if you need to perform many small temporary table operations and the default temporary tablespace is configured for sort operations and thus uses a large extent size, these small operations will consume lots of unnecessary disk space. In this case it is better to allocate a second temporary tablespace with a smaller extent size.
The following two statements create a temporary tablespace with a 64 KB extent size, and then a new temporary table in that tablespace.
CREATE TEMPORARY TABLESPACE tbs_t1 TEMPFILE 'tbs_t1.f' SIZE 50m REUSE AUTOEXTEND ON MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K; CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS TABLESPACE tbs_t1;
See Also:"Temporary Tablespaces"
Unlike permanent tables, temporary tables and their indexes do not automatically allocate a segment when they are created. Instead, segments are allocated when the first
SELECT) is performed. This means that if a
DELETE is performed before the first
INSERT, the table appears to be empty.
DDL operations (except
TRUNCATE) are allowed on an existing temporary table only if no session is currently bound to that temporary table.
If you rollback a transaction, the data you entered is lost, although the table definition persists.
A transaction-specific temporary table allows only one transaction at a time. If there are several autonomous transactions in a single transaction scope, each autonomous transaction can use the table only as soon as the previous one commits.
Because the data in a temporary table is, by definition, temporary, backup and recovery of temporary table data is not available in the event of a system failure. To prepare for such a failure, you should develop alternative methods for preserving temporary table data.
When you specify the
AS SELECT clause to create a table and populate it with data from another table, you can utilize parallel execution. The
CREATE TABLE...AS SELECT statement contains two parts: a
CREATE part (DDL) and a
SELECT part (query). Oracle Database can parallelize both parts of the statement. The
CREATE part is parallelized if one of the following is true:
PARALLEL clause is included in the
CREATE TABLE...AS SELECT statement
ALTER SESSION FORCE PARALLEL DDL statement is specified
The query part is parallelized if all of the following are true:
The query includes a parallel hint specification (
PARALLEL_INDEX) or the
CREATE part includes the
PARALLEL clause or the schema objects referred to in the query have a
PARALLEL declaration associated with them.
At least one of the tables specified in the query requires either a full table scan or an index range scan spanning multiple partitions.
If you parallelize the creation of a table, that table then has a parallel declaration (the
PARALLEL clause) associated with it. Any subsequent DML or queries on the table, for which parallelization is possible, will attempt to use parallel execution.
The following simple statement parallelizes the creation of a table and stores the result in a compressed format, using table compression:
CREATE TABLE hr.admin_emp_dept PARALLEL COMPRESS AS SELECT * FROM hr.employees WHERE department_id = 10;
In this case, the
PARALLEL clause tells the database to select an optimum number of parallel execution servers when creating the table.