COPY {FROM database | TO database | FROM database TO database} {APPEND|CREATE|INSERT|REPLACE} destination_table [(column, column, column, ...)] USING query
databaseでは、次の構文に従います。
username[/password]@connect_identifier
問合せから、同じまたは別のデータベース内の表にデータをコピーします。 COPYは、次のデータ型をサポートします。
警告:
パスワードをプレーン・テキストで指定すると、セキュリティ上の危険があります。パスワードを省略し、パスワードの入力を求めるプロンプトが表示された場合にのみ入力することで、この危険を回避できます。
項または句の詳細は、次の説明を参照してください。
FROM database
コピーするデータを含むデータベースを指定します。FROM句を省略した場合のデフォルトのソースは、SQL*Plusが接続されているデータベース(他のコマンドがアドレス指定するデータベース)です。デフォルト以外のソース・データベースを指定するには、FROM句を使用する必要があります。COPYコマンドのFROM句では、SYSDBAまたはSYSOPER権限での接続はサポートされていません。
TO database
宛先表を含むデータベースを指定します。TO句を省略した場合のデフォルトの宛先は、SQL*Plusが接続されているデータベース(他のコマンドがアドレス指定するデータベース)です。デフォルト以外の宛先データベースを指定するには、TO句を使用する必要があります。COPYコマンドのTO句では、SYSDBAまたはSYSOPER権限での接続はサポートされていません。
database
FROM句またはTO句で指定するコピー元またはコピー先のOracle Databaseをusername[/password] @connect_identifierで指定します。COPYコマンドでは、SYSDBAまたはSYSOPER権限での接続はサポートされていません。ユーザー名を指定する必要があります。SQL*Plusによって、COPY FROMまたはCOPY TO句で指定したユーザー名に関連付けられたパスワードの入力を求められます。SQL*Plusでは、このパスワードへの応答は表示されません。
コピー元またはコピー先データベースの指定に、connect_identifier句を含める必要があります。正確な構文はOracle Netの構成によって異なります。詳細は、Oracle Netのマニュアルを参照するか、またはデータベース管理者に問い合せてください。
APPEND
destination_tableが存在する場合は、queryからその表へ行が挿入されます。destination_tableが存在しない場合、COPYによってその表が作成されます。
CREATE
destination_tableを作成した後、queryからその表に行が挿入されます。destination_tableがすでに存在している場合は、COPYによってエラーが戻されます。
INSERT
queryからdestination_tableに行が挿入されます。destination_tableが存在しない場合は、COPYによってエラーが戻されます。INSERTを使用するときは、USING queryによってdestination_tableの中の各列について1列ずつ選択する必要があります。
REPLACE
destination_tableおよびその内容をqueryからの行に置換します。destination_tableが存在しない場合、COPYによってその表が作成されます。存在する場合は、COPYによってその既存の表が削除され、コピーしたデータを含む表で置換されます。
destination_table
(column, column, column, ...)
destination_tableの中の列の名前を指定します。名前に小文字または空白が含まれている場合は、その名前を二重引用符で囲む必要があります。
列を指定する場合は、問合せで選択された列と同じ数の列を指定する必要があります。COPYによってdestination_tableを作成する場合に、列を指定しないと、宛先表内でのコピーされた列の名前は、ソースでの名前と同じものになります。
USING query
Oracle DatabaseとOracle以外のデータベースの間でデータをコピーできるようにするため、NUMBER列は宛先の表の中でDECIMAL列に変更されます。したがって、Oracle Database間でコピーする場合、精度がないNUMBER列はDECIMAL(38)列に変更されます。Oracle Database間でコピーする場合は、SQLコマンド(CREATE TABLE ASおよびINSERT)を使用するか、列に精度が指定されている必要があります。
SQL*PlusのSET LONG変数は、コピーするLONG列の長さを制限するために使用します。LONG列にLONGの値より長いデータが含まれている場合、COPYによってそのデータが切り捨てられます。
SQL*Plusは、COPYが正常に完了するたびにコミットを実行します。SQL*PlusのSET COPYCOMMIT変数を正の値nに設定すると、SQL*Plusはレコード・バッチをn回コピーするたびにコミットを1回行います。パッチのサイズは、SQL*PlusのSET ARRAYSIZE変数によって決まります。
操作環境によっては、サービス名を二重引用符で囲む必要があります。
次のコマンドは、EMPLOYEES表の全体をWESTEMPLOYEESという名前の表にコピーします。これらの表は2つの異なるデータベース内にあります。WESTEMPLOYEESがすでに存在している場合は、SQL*Plusによって、その表およびその内容が置換されます。WESTEMPLOYEESの中の列は、ソース表EMPLOYEESの中の列と同じ名前になります。
COPY FROM HR@HQ TO JOHN@WEST - REPLACE WESTEMPLOYEES - USING SELECT * FROM EMPLOYEES
次のコマンドは、EMPLOYEESから選択したレコードを、SQL*Plusが接続されているデータベースにコピーします。SQL*Plusは、コピーによってSALESMENを作成します。SQL*Plusは、列EMPLOYEE_IDおよびLAST_NAMEのみをコピーし、コピー先でそれらをEMPLOYEE_IDおよびSA_MANと命名します。
COPY FROM HR@ORACLE01 - CREATE SALESMEN (EMPLOYEE_ID, SA_MAN) - USING SELECT EMPLOYEE_ID, LAST_NAME FROM EMPLOYEES - WHERE JOB_ID='SA_MAN';