|SQL*Plus User's Guide and Reference
Part Number A88827-02
Accessing SQL Databases, 4 of 5
Use the SQL*Plus COPY command to copy CHAR, DATE, LONG, NUMBER or VARCHAR2 data between databases and between tables on the same database. With the COPY command, you can copy data between databases in the following ways:
You enter the COPY command in the following form:
COPY FROM database TO database action - destination_table (column_name, column_name, - column_name ...) USING query
Here is a sample COPY command:
COPY FROM HR/HR@BOSTONDB - TO TODD/FOX@CHICAGODB - CREATE NEWDEPT (DEPARTMENT_ID, DEPARTMENT_NAME, CITY) - USING SELECT * FROM EMP_DETAILS_VIEW
To specify a database in the FROM or TO clause, you must have a valid username and password for the local and remote database(s) and know the appropriate Oracle Net service name(s). 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 benefits 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 the section "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.
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/HR@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 command files rather than trying to enter them directly at the command prompt.
You control the treatment of the destination table by entering one of four control clauses--REPLACE, CREATE, INSERT, or APPEND.
The REPLACE clause names the table to be created in the destination database and specifies the following actions:
You can use the CREATE clause to avoid accidentally writing over an existing table. CREATE specifies the following actions:
Use INSERT to insert data into an existing table. INSERT specifies the following actions:
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:
To copy HR from a remote database into a table called EMPLOYEE_COPY on your own database, enter the following command:
COPY FROM HR/HR@BOSTONDB - CREATE EMPCOPY - USING SELECT * FROM HR Array fetch/bind size is 15. (arraysize is 15) Will commit when done. (copycommit is 0) Maximum long size is 80. (long is 80)
SQL*Plus then creates the table EMPLOYEE_COPY and copies the rows:
Table SALESMAN created. 5 rows selected from HR@BOSTONDB. 5 rows inserted into SALESMAN. 5 rows committed into SALESMAN at DEFAULT HOST connection.
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 HR.
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 hyphen (-), optionally preceded by a space, at the end of each line except the last.
The first three messages displayed by COPY show the values of SET command variables that affect the COPY operation. The most important one is LONG, which limits the length of a LONG column's value. (LONG is a datatype, similar to CHAR.) If the source table contains a LONG column, COPY truncates values in that column to the length specified by the system variable LONG.
The variable ARRAYSIZE limits the number of rows that SQL*Plus fetches from the database at one time. This number of rows makes up a batch. The variable COPYCOMMIT sets the number of batches after which COPY commits changes to the database. (If you set COPYCOMMIT to zero, COPY commits changes only after all batches are copied.) For more information on the variables of the SET command, including how to change their settings, see the SET command in Chapter 8.
After listing the three system variables and their values, COPY tells you if a table was dropped, created, or updated during the copy. Then COPY lists the number of rows selected, inserted, and committed.
You can refer to another user's table in a COPY command by qualifying the table name with the username, just as you would in your local database, or in a query with a database link.
For example, to make a local copy of a table named DEPARTMENT owned by the username ADAMS on the database associated with the Oracle Net connect identifier BOSTONDB, you would enter
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.