| SQL*Plus ユーザーズ・ガイドおよびリファレンス 10g リリース2(10.2) B19277-01 |
|
ここでは、次の項目について説明します。
この章を読むときは、コンピュータ上で、示されている例を実際に試してみてください。始める前に、「SQL*Plusクイック・スタート」で説明したサンプル表へのアクセス権限があることを確認してください。
COPYコマンドは、SQL*Plusの今後のリリースで廃止される予定です。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は、次のデータ型をサポートします。
項または句の詳細は、次の説明を参照してください。
FROM database
コピーするデータを含むデータベースを指定します。FROM句を省略した場合のデフォルトのソースは、SQL*Plusが接続されているデータベース(他のコマンドがアドレス指定するデータベース)です。デフォルト以外のソース・データベースを指定するには、FROM句を使用する必要があります。 COPYコマンドのFROM句では、SYSDBAまたはSYSOPER権限での接続はサポートされていません。
TO database
宛先表を含むデータベースを指定します。TO句を省略した場合のデフォルトの宛先は、SQL*Plusが接続されているデータベース(他のコマンドがアドレス指定するデータベース)です。デフォルト以外の宛先データベースを指定するには、TO句を使用する必要があります。COPYコマンドのTO句では、SYSDBAまたはSYSOPER権限での接続はサポートされていません。
database
FROM句またはTO句で指定する、コピー元またはコピー先のOracleデータベースを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コマンド)を指定します。
OracleデータベースとOracle以外のデータベースの間でデータをコピーできるようにするため、NUMBER列は宛先の表の中でDECIMAL列に変更されます。したがって、Oracleデータベース間でコピーする場合、精度がないNUMBER列はDECIMAL(38)列に変更されます。Oracleデータベース間でコピーする場合は、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';
データベース間および同じデータベースの表同士の間でCHAR、DATE、LONG、NUMBERまたはVARCHAR2のデータをコピーするには、SQL*PlusのCOPYコマンドを使用します。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データベース・セキュリティに従うため、表にアクセスするには、指定するユーザー名に表へのアクセス権限が必要です。どのデータベースが使用可能であるかについては、DBAに問い合せてください。
リモート・データベースからローカル・データベースにコピーする場合は、TO句を省略できます。ローカル・データベースからリモート・データベースにコピーする場合は、FROM句を省略できます。リモート・データベース間でコピーする場合は、必ず両方の句を指定します。両方の句を挿入すると、スクリプトが読みやすくなります。
COPYコマンドの動作は、宛先の表がすでに存在するかどうかおよびユーザーが入力したアクション句(例ではCREATE)によって異なります。詳細は、「宛先の表の扱いを制御する方法」を参照してください。
デフォルトでは、宛先の表にコピーされた列は元の表での名前と同じ名前になります。宛先の表の中で列に新しい名前を指定する場合は、宛先の表名の後に新しい名前をカッコで囲んで入力します。1つでも列名を入力する場合は、コピーするすべての列の名前を入力する必要があります。
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コマンドは、コマンド・プロンプトから直接入力するよりも、スクリプトまたはiSQL*Plusの作業領域の入力領域に入力して編集する方が簡単です。
宛先の表の扱いを制御するには、REPLACE、CREATE、INSERTまたはAPPENDの4つの制御句のいずれかを入力します。
REPLACE句は、宛先のデータベース内に作成する表の名前を指定し、次のアクションを指定します。
既存の表を誤って上書きしないように、CREATE句を使用することができます。CREATEは、次のアクションを指定します。
既存の表にデータを挿入するには、INSERTを使用します。INSERTは、次のアクションを指定します。
既存の表にデータを挿入する場合、または宛先の表が存在しないときに新しい表を作成する場合は、APPENDを使用します。APPENDは、次のアクションを指定します。
リモート・データベースからユーザー自身のデータベース上にあるEMPLOYEE_COPYという表にHRをコピーするには、次のコマンドを入力します。
COPY FROM HR@BOSTONDB - CREATE EMPCOPY - USING SELECT * FROM HR
Array fetch/bind size is 15. (arraysize is 15) |
その後、SQL*Plusは表EMPLOYEE_COPYを作成し、行をコピーします。
Table SALESMAN created. |
このCOPYコマンドにFROM句を指定した場合は、BOSTONDBで指定されたデータベースに、ユーザー名HRで接続されます。
コマンドの終わりにセミコロンを付ける必要はありません。COPYは問合せを含んでいても、SQLコマンドではなくSQL*Plusコマンドです。ほとんどのCOPYは、長さが1行を超えるので、最終行を除く各行の終わりに、ハイフン(-)を使用する必要があります。ハイフンの前に空白を付けてもかまいません。
COPYによって表示される最初の3つのメッセージは、そのCOPY操作に影響するSETコマンド変数の値を示しています。最も重要なのはLONGで、これはLONG列の値の長さを制限します(LONGは、CHARと同じように1つのデータ型です)。元の表にLONG列が含まれている場合、COPYでは、その列の値はシステム変数LONGで指定された長さまで切り捨てられます。
ARRAYSIZE変数は、SQL*Plusがデータベースから一度にフェッチする行数を制限します。これらの行は、バッチを形成します。COPYCOMMIT変数は、COPYが変更をデータベースにコミットした後のバッチの数を設定します(COPYCOMMITを0(ゼロ)に設定した場合、COPYはすべてのバッチがコピーされた後にのみ、変更をコミットします)。SET変数の詳細は、「SET」コマンドを参照してください。
3つのシステム変数およびそれらの値が表示された後、コピーの間に表の削除、作成または変更があったかどうかが示されます。その後、選択、挿入およびコミットが実行された行数が表示されます。
ローカル・データベースの場合やデータベース・リンクを使用した問合せの場合と同様に、COPYコマンドの中で表名をユーザー名で修飾することによって、別のユーザー表を参照できます。
たとえば、ユーザー名ADAMSが所有し、Oracle Net接続識別子BOSTONDBに対応付けられているデータベース上にあるDEPTという名前の表のローカル・コピーを作成するには、次のように入力します。
COPY FROM HR@BOSTONDB - CREATE EMPLOYEE_COPY2 - USING SELECT * FROM ADAMS.DEPARTMENT
COPYにリモート・データベースへログインするよう指示することによって、ADAMSと同じ結果を得ることができます。ただし、ユーザー名ADAMSに対応付けられているパスワードを知らないと実行できません。
単一のデータベース(ローカルまたはリモート)内で、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
|
![]() Copyright © 2005 Oracle Corporation. All Rights Reserved. |
|