日本語PDF

B SQL*PlusのCOPYコマンド

ここでは、次の項目について説明します。

この章を読むときは、コンピュータ上で、示されている例を実際に試してみてください。始める前に、「SQL*Plusのクイック・スタート 」で説明したサンプル表へのアクセス権限があることを確認してください。

COPYコマンドは、SQL*Plusの今後のリリースで非推奨となる予定です。Oracle 9iより後では、新しいデータ型はCOPYでサポートされていません。

B.1 COPYコマンドの構文

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は、次のデータ型をサポートします。

  • CHAR
  • DATE
  • LONG
  • NUMBER
  • VARCHAR2

警告:

パスワードをプレーン・テキストで指定すると、セキュリティ上の危険があります。パスワードを省略し、パスワードの入力を求めるプロンプトが表示された場合にのみ入力することで、この危険を回避できます。

B.1.1 条件

項または句の詳細は、次の説明を参照してください。

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

COPYによってコピーする行および列を決定するSQL問合せ(SELECTコマンド)を指定します。

B.1.2 使用方法

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変数によって決まります。

操作環境によっては、サービス名を二重引用符で囲む必要があります。

B.1.3

次のコマンドは、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';

B.2 データベース間でのデータのコピー

データベース間および同じデータベースの表同士の間でCHAR、DATE、LONG、NUMBERまたはVARCHAR2のデータをコピーするには、SQL*PlusのCOPYコマンドを使用します。COPYコマンドを使用すると、次のようなデータベース間でのデータのコピーが可能です。

  • リモート・データベースからローカル・データベースへのデータのコピー

  • ローカル(デフォルト)・データベースから(ほとんどのシステム上の)リモート・データベースへのデータのコピー

  • あるリモート・データベースから(ほとんどのシステム上の)別のリモート・データベースへのデータのコピー

    ノート:

    一般に、COPYコマンドは、Oracle DatabaseとOracle以外のデータベースの間でデータをコピーするために使用するように設計されています。Oracle Database間でデータをコピーするには、SQLコマンド(CREATE TABLE ASおよびINSERT)を使用してください。

B.2.1 COPYコマンド構文について

COPYコマンドは、次の形式で入力します。

COPY FROM database TO database action -
destination_table (column_name, column_name, -
column_name ...) USING query

次にCOPYコマンドの例を示します。

COPY FROM HR@BOSTONDB -
TO TODD@CHICAGODB -
CREATE NEWDEPT (DEPARTMENT_ID, DEPARTMENT_NAME, CITY) -
USING SELECT * FROM EMP_DETAILS_VIEW

FROM句またはTO句の中でデータベースを指定するには、ローカル・データベースおよびリモート・データベースに対して有効なユーザー名およびパスワードが必要で、適切なOracle Netサービス名を指定する必要があります。 COPYは、Oracle Databaseセキュリティに従うため、表にアクセスするには、指定するユーザー名に表へのアクセス権限が必要です。どのデータベースが使用可能であるかについては、DBAに問い合せてください。

リモート・データベースからローカル・データベースにコピーする場合は、TO句を省略できます。ローカル・データベースからリモート・データベースにコピーする場合は、FROM句を省略できます。リモート・データベース間でコピーする場合は、必ず両方の句を指定します。両方の句を挿入すると、スクリプトが読みやすくなります。

COPYコマンドの動作は、宛先の表がすでに存在するかどうかおよびユーザーが入力したアクション句(例ではCREATE)によって異なります。詳細は、宛先の表の扱いを制御する方法についてを参照してください。

デフォルトでは、宛先の表にコピーされた列は元の表での名前と同じ名前になります。宛先の表の中で列に新しい名前を指定する場合は、宛先の表名の後に新しい名前をカッコで囲んで入力します。1つでも列名を入力する場合は、コピーするすべての列の名前を入力する必要があります。

ノート:

Oracle DatabaseとOracle以外のデータベースの間でデータをコピーできるようにするため、NUMBER列は宛先の表の中でDECIMAL列に変更されます。したがって、Oracle Database間でコピーする場合、精度がないNUMBER列はDECIMAL(38)列に変更されます。Oracle Database間でコピーする場合は、SQLコマンド(CREATE TABLE ASおよびINSERT)を使用するか、列に精度が指定されている必要があります。

USING句を使用すると、元の表に対して問合せを行うことによって、COPYで宛先の表にコピーするデータを指定できます。COPYコマンドでコピーするデータを選択するには、任意の形式でSQLのSELECTコマンドを使用できます。

次に示すCOPYコマンドの例では、ソース表から2つの列のみをコピーし、DEPARTMENT_IDの値が30である行のみをコピーします。

COPY FROM HR@BOSTONDB -
REPLACE EMPCOPY2 -
USING SELECT LAST_NAME, SALARY -
FROM EMP_DETAILS_VIEW -
WHERE DEPARTMENT_ID = 30

長いCOPYコマンドは、コマンド・プロンプトから直接入力するよりも、スクリプトに入力して編集する方が簡単です。

B.2.2 宛先の表の扱いを制御する方法について

宛先の表の扱いを制御するには、REPLACE、CREATE、INSERTまたはAPPENDの4つの制御句のいずれかを入力します。

REPLACE句は、宛先のデータベース内に作成する表の名前を指定し、次のアクションを指定します。

  • 宛先の表がすでに存在する場合、COPYは既存の表を削除し、コピーされたデータが入った表に置き換えます。

  • 宛先の表が存在しない場合、COPYはコピーされたデータを使用してその表を作成します。

既存の表を誤って上書きしないように、CREATE句を使用することができます。CREATEは、次のアクションを指定します。

  • 宛先の表がすでに存在する場合、COPYはエラーを報告して停止します。

  • 宛先の表が存在しない場合、COPYはコピーされたデータを使用してその表を作成します。

既存の表にデータを挿入するには、INSERTを使用します。INSERTは、次のアクションを指定します。

  • 宛先の表がすでに存在する場合、COPYはコピーされたデータを宛先の表に挿入します。

  • 宛先の表が存在しない場合、COPYはエラーを報告して停止します。

既存の表にデータを挿入する場合、または宛先の表が存在しないときに新しい表を作成する場合は、APPENDを使用します。APPENDは、次のアクションを指定します。

  • 宛先の表がすでに存在する場合、COPYはコピーされたデータを宛先の表に挿入します。

  • 表が存在しない場合、COPYは表を作成し、コピーされたデータをその表に挿入します。

ノート:

EMPLOYEE_COPYのコピーが入っているリモート・コンピュータ用の適切なユーザー名、パスワードおよびサービス名については、DBAに問い合せてください。

COPY FROM 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は表EMPLOYEE_COPYを作成し、行をコピーします。

Table SALESMAN created.

   5 rows selected from HR@BOSTONDB.
   5 rows inserted into SALESMAN.
   5 rows committed into SALESMAN at DEFAULT HOST connection.

このCOPYコマンドにFROM句を指定した場合は、BOSTONDBで指定されたデータベースに、ユーザー名HRで接続されます。

コマンドの終わりにセミコロンを付ける必要はありません。COPYは問合せを含んでいても、SQLコマンドではなくSQL*Plusコマンドです。ほとんどのCOPYは長さが1行を超えるので、最終行を除く各行の終わりにハイフン(-)を使用する必要があります。ハイフンの前に空白を付けてもかまいません。

例B-1 CREATEを使用したリモート・データベースからローカル・データベースへのコピー

リモート・データベースからユーザー自身のデータベース上にあるEMPLOYEE_COPYという表にHRをコピーするには、次のコマンドを入力します。

B.2.3 COPYで表示されるメッセージの解釈について

COPYによって表示される最初の3つのメッセージは、そのCOPY操作に影響するSETコマンド変数の値を示しています。最も重要なのはLONGで、これはLONG列の値の長さを制限します。(LONGは、CHARと同じように1つのデータ型です。)元の表にLONG列が含まれている場合、COPYでは、その列の値はシステム変数LONGで指定された長さまで切り捨てられます。

ARRAYSIZE変数は、SQL*Plusがデータベースから一度にフェッチする行数を制限します。これらの行は、バッチを形成します。COPYCOMMIT変数には、COPYでデータベースに変更がコミットされる前にコピーされるバッチの数を設定します。(COPYCOMMITを0に設定した場合、COPYはすべてのバッチがコピーされた後にのみ、変更をコミットします。)設定の変更方法など、SET変数の詳細は、「SET」コマンドを参照してください。

3つのシステム変数およびそれらの値が表示された後、コピーの間に表の削除、作成または変更があったかどうかが示されます。その後、選択、挿入およびコミットが実行された行数が表示されます。

B.2.4 別ユーザーの表の指定

ローカル・データベースの場合やデータベース・リンクを使用した問合せの場合と同様に、COPYコマンドの中で表名をユーザー名で修飾することによって、別のユーザー表を参照できます。

たとえば、ユーザー名ADAMSが所有し、Oracle Net接続識別子BOSTONDBに対応付けられているデータベース上にあるDEPARTMENTという名前の表のローカル・コピーを作成するには、次のように入力します。

COPY FROM HR@BOSTONDB -
CREATE EMPLOYEE_COPY2 -
USING SELECT * FROM ADAMS.DEPARTMENT

COPYにリモート・データベースへログインするよう指示することによって、ADAMSと同じ結果を得ることができます。ただし、ユーザー名ADAMSに対応付けられているパスワードを知らないと実行できません。

B.3 1つのデータベース上にある表の間でのデータのコピーについて

単一のデータベース(ローカルまたはリモート)内で、1つの表から別の表にデータをコピーできます。ローカル・データベース内の表と表の間でコピーするには、次のようにFROM句またはTO句のいずれかで(その他の句は省略し)、ユーザー自身のユーザー名およびローカル・データベースのサービス名を指定します。

COPY FROM HR@MYDATABASE -
INSERT EMPLOYEE_COPY2 -
USING SELECT * FROM EMPLOYEE_COPY

リモート・データベース上にある表と表の間でコピーするには、次のようにFROM句およびTO句の両方に同じユーザー名およびサービス名を挿入します。

COPY FROM HR@BOSTONDB -
TO HR@BOSTONDB -
INSERT EMPLOYEE_COPY2 -
USING SELECT * FROM EMPLOYEE_COPY