Professional Documents
Culture Documents
before a COMMIT is issued, and the number of characters copied when a column is a
LONG datatype.
If you're moving data from one remote server to another, it's best to run the command
directly from either of the servers, as if you run it at your client machine, the data passes
through your PC on route between the two servers.
You can also run this command using the iSQL*Plus web-based version of SQL*Plus,
which would make it easier to avoid inadvertandly moving the data through your client
machine, as you'll be able to directly log on to the remote server rather than running the
command locally. Also, there's rumours that SQL*Plus will either be desupported, or
even not shipped, with Oracle 10G, so it's probably worth getting used to running it on
the web-based version from the outset.
Read this chapter while sitting at your computer and try out the example shown. Before
beginning, make sure you have access to the sample tables described in Chapter 1, "SQL*Plus
Overview".
The COPY command will be obsoleted in future releases of SQL*Plus. COPY supports the
datatypes listed for the COPY command, but no new datatypes will be supported.
Terms
Refer to the following list for a description of each term or clause:
FROM database
The database that contains the data to be copied. If you omit the FROM clause, the source
defaults to the database to which SQL*Plus is connected (that is, the database that other
commands address). You must use a FROM clause to specify a source database other than the
default.
TO database
The database containing the destination table. If you omit the TO clause, the destination defaults
to the database to which SQL*Plus is connected (that is, the database that other commands
address). You must use a TO clause to specify a destination database other than the default.
database
Specifies username[/password] @connect_identifier of the Oracle source or destination database
you wish to COPY FROM or COPY TO. If you do not specifypassword in either the COPY
FROM clause or the COPY TO clause, SQL*Plus will prompt you for it. SQL*Plus suppresses
the display of your password response.
You must include the connect_identifier clause which consists of an Oracle Net connection string,
to specify the source or destination database. The exact syntax depends upon the Oracle Net
communications protocol your Oracle installation uses. For more information, refer to the Oracle
Net manual appropriate for your protocol or contact your DBA.
APPEND
Inserts the rows from query into destination_table if the table exists. If destination_table does not
exist, COPY creates it.
CREATE
Inserts the rows from query into destination_table after first creating the table.
If destination_table already exists, COPY returns an error.
INSERT
Inserts the rows from query into destination_table. If destination_table does not exist, COPY
returns an error. When using INSERT, the USING query must select one column for each column
in the destination_table.
REPLACE
Replaces destination_table and its contents with the rows from query. If destination_table does
not exist, COPY creates it. Otherwise, COPY drops the existing table and replaces it with a table
containing the copied data.
destination_table
Represents the table you wish to create or to which you wish to add data.
(column, column, column, ...)
Specifies the names of the columns in destination_table. You must enclose a name in double
quotes if it contains lowercase letters or blanks.
If you specify columns, the number of columns must equal the number of columns selected by the
query. If you do not specify any columns, the copied columns will have the same names in the
destination table as they had in the source if COPY creates destination_table.
USING query
Specifies a SQL query (SELECT command) determining which rows and columns COPY copies.
Usage
To enable the copying of data between Oracle and non-Oracle databases, NUMBER columns are
changed to DECIMAL columns in the destination table. Hence, if you are copying between
Oracle databases, a NUMBER column with no precision will be changed to a DECIMAL(38)
column. When copying between Oracle databases, you should use SQL commands (CREATE
TABLE AS and INSERT) or you should ensure that your columns have a precision specified.
The SQL*Plus SET LONG variable limits the length of LONG columns that you copy. If any
LONG columns contain data longer than the value of LONG, COPY truncates the data.
SQL*Plus performs a commit at the end of each successful COPY. If you set the SQL*Plus SET
COPYCOMMIT variable to a positive value n, SQL*Plus performs a commit after copying every
n batches of records. The SQL*Plus SET ARRAYSIZE variable determines the size of a batch.
Some operating environments require that service names be placed in double quotes.
Examples
The following command copies the entire EMPLOYEES table to a table named
WESTEMPLOYEES. Note that the tables are located in two different databases. If
WESTEMPLOYEES already exists, SQL*Plus replaces the table and its contents. The columns
in WESTEMPLOYEES have the same names as the columns in the source table, EMPLOYEES.
The following command copies selected records from EMPLOYEES to the database to which
SQL*Plus is connected. SQL*Plus creates SALESMEN through the copy. SQL*Plus copies only
the columns EMPLOYEE_ID and LAST_NAME, and at the destination names them
EMPLOYEE_ID and SA_MAN.
COPY FROM HR/your_password@ORACLE01 CREATE SALESMEN (EMPLOYEE_ID, SA_MAN) USING SELECT EMPLOYEE_ID, LAST_NAME FROM EMPLOYEES WHERE JOB_ID='SA_MAN';
Note:
In general, the COPY command was designed to be used for copying
data between Oracle and non-Oracle databases. You should use SQL
commands (CREATE TABLE AS and INSERT) to copy data between
Oracle databases.
To specify a database in the FROM or TO clause, you must have a valid username and password
for the local and remote databases and know the appropriate Oracle Net service names. COPY
obeys Oracle security, so the username you specify must have been granted access to tables for
you to have access to tables. For information on what databases are available to you, contact your
DBA.
When you copy to your local database from a remote database, you can omit the TO clause.
When you copy to a remote database from your local database, you can omit the FROM clause.
When you copy between remote databases, you must include both clauses. However, including
both clauses increases the readability of your scripts.
The COPY command behaves differently based on whether the destination table already exists
and on the action clause you enter (CREATE in the example above). For more information,
see "Controlling Treatment of the Destination Table" later in this chapter.
By default, the copied columns have the same names in the destination table that they have in the
source table. If you want to give new names to the columns in the destination table, enter the new
names in parentheses after the destination table name. If you enter any column names, you must
enter a name for every column you are copying.
Note:
To enable the copying of data between Oracle and non-Oracle
databases, NUMBER columns are changed to DECIMAL columns in
the destination table. Hence, if you are copying between Oracle
databases, a NUMBER column with no precision will be changed to a
DECIMAL(38) column. When copying between Oracle databases, you
should use SQL commands (CREATE TABLE AS and INSERT) or you
should ensure that your columns have a precision specified.
The USING clause specifies a query that names the source table and specifies the data that COPY
copies to the destination table. You can use any form of the SQL SELECT command to select the
data that the COPY command copies.
Here is an example of a COPY command that copies only two columns from the source table, and
copies only those rows in which the value of DEPARTMENT_ID is 30:
COPY FROM HR/your_password@BOSTONDB REPLACE EMPCOPY2 USING SELECT LAST_NAME, SALARY FROM EMP_DETAILS_VIEW WHERE DEPARTMENT_ID = 30
You may find it easier to enter and edit long COPY commands in scripts rather than trying to
enter them directly at the command prompt.
If the destination table already exists, COPY drops the existing table and replaces it with
a table containing the copied data.
If the destination table does not already exist, COPY creates it using the copied data.
You can use the CREATE clause to avoid accidentally writing over an existing table. CREATE
specifies the following actions:
If the destination table already exists, COPY reports an error and stops.
If the destination table does not already exist, COPY creates the table using the copied
data.
Use INSERT to insert data into an existing table. INSERT specifies the following actions:
If the destination table already exists, COPY inserts the copied data in the destination
table.
If the destination table does not already exist, COPY reports an error and stops.
Use APPEND when you want to insert data in an existing table, or create a new table if the
destination table does not exist. APPEND specifies the following actions:
If the destination table already exists, COPY inserts the copied data in the destination
table.
If the table does not already exist, COPY creates the table and then inserts the copied data
in it.
Note:
See your DBA for an appropriate username, password, and service
name for a remote computer that contains a copy of
EMPLOYEE_COPY.
SQL*Plus then creates the table EMPLOYEE_COPY and copies the rows:
In this COPY command, the FROM clause directs COPY to connect you to the database with the
specification D:BOSTON-MFG as HR, with the password your_password.
Notice that you do not need a semicolon at the end of the command; COPY is a SQL*Plus
command, not a SQL command, even though it contains a query. Since most COPY commands
are longer than one line, you must use a line continuation hyphen (-), optionally preceded by a
space, at the end of each line except the last.
Of course, you could get the same result by instructing COPY to log in to the remote database as
ADAMS. You cannot do that, however, unless you know the password associated with the
username ADAMS.
To copy between tables on a remote database, include the same username, password, and service
name in the FROM and TO clauses:
COPY FROM HR/your_password@BOSTONDB TO HR/your_password@BOSTONDB INSERT EMPLOYEE_COPY2 USING SELECT * FROM EMPLOYEE_CO