4 SQL*Plusの基本
この章では、SQL*Plusの基本的な使用方法を学習します。内容は次のとおりです。
4.1 コマンドの入力と実行について
特に指定がないかぎり、コマンドの使用方法についての説明はすべてのユーザー・インタフェースに適用できます。
コマンドラインでは、SQL*Plusプロンプトでコマンドを入力し、[Return]を押して実行します。
通常、コマンド内の単語と単語を区切るには、空白かタブを使用します。また、コマンドを読みやすくするために、単語と単語の間に空白またはタブを追加することもできます。
大文字と小文字の区別は、オペレーティング・システムによって異なります。このマニュアルでは、わかりやすくするため、表名、列名およびコマンドをすべて大文字で表記しています。
-
データベース内の情報を処理するためのSQLコマンド
-
データベース内の情報を処理するためのPL/SQLブロック
-
問合せ結果の書式設定、オプションの設定、SQLコマンドとPL/SQLブロックの編集および格納を行うためのSQL*Plusコマンド
コマンドを次の行に続ける方法、コマンドの終了方法、コマンドの実行方法は、入力して実行するコマンドのタイプによって異なります。次の各ページでは、それらのタイプのコマンドを実行する例を示します。
4.1.1 SQLバッファ
SQLバッファには、最後に入力されたSQLコマンドまたはPL/SQLブロック(SQL*Plusコマンドではなく)が格納されます。コマンドやブロックは、次のSQLコマンドまたはPL/SQLブロックに置換されるまでバッファに格納されます。LISTコマンドを使用して、バッファの内容を表示できます。
RUNまたは/(スラッシュ)コマンドを使用して、SQLバッファ内のコマンドまたはブロックを実行できます。RUNを使用すると、バッファ内のコマンドまたはブロックが表示されてから実行されます。/(スラッシュ)を使用すると、バッファ内のコマンドまたはブロックは表示されずに実行されます。バッファ内に格納されたコマンドやブロックの編集については、SQL*Plusコマンドラインでのスクリプトの編集についてを参照してください。
SQL*Plusでは、SQL*Plusコマンドまたはコマンドを実行するために入力したセミコロンやスラッシュは、SQLバッファに格納されません。
4.2 表定義の表示について
指定された表またはビューの各列の定義を表示するには、SQL*PlusのDESCRIBEコマンドを使用します。
Name Null? Type
----------------------------------------- -------- ----------------
EMPLOYEE_ID NOT NULL NUMBER(6)
JOB_ID NOT NULL VARCHAR2(10)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
LOCATION_ID NUMBER(4)
COUNTRY_ID CHAR(2)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
JOB_TITLE NOT NULL VARCHAR2(35)
CITY NOT NULL VARCHAR2(30)
STATE_PROVINCE VARCHAR2(25)
COUNTRY_NAME VARCHAR2(40)
REGION_NAME VARCHAR2(25)
ノート:
DESCRIBEは、Oracle Databaseデータ・ディクショナリ内の情報へのアクセスに使用します。SQLのSELECTコマンドを使用すると、データベース内のこれらの情報や他の情報にもアクセスできます。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
例4-1 DESCRIBEコマンドの使用
EMP_DETAILS_VIEWというサンプル・ビューの列定義を表示するには、次のように入力します。
DESCRIBE EMP_DETAILS_VIEW
4.3 PL/SQL定義の表示について
ファンクションまたはプロシージャの定義を表示するには、SQL*PlusのDESCRIBEコマンドを使用します。
例4-2 DESCRIBEコマンドの使用
AFUNCというファンクションの定義を作成および表示するには、次のように入力します。
create or replace function afunc (f1 varchar2, f2 number) return number as begin if (length(f1) > f2) then return 1; else return 0; end if; end; /
FUNCTION created.
DESCRIBE afunc
FUNCTION afunc RETURNS NUMBER
Argument Name Type In/Out Default?
--------------- -------- -------- ---------
F1 VARCHAR2 IN
F2 NUMBER IN
4.4 SQLコマンドの実行
SQLコマンド言語を使用すると、データベース内のデータを操作できます。個々のSQLコマンドについては、『Oracle Database SQL言語リファレンス』を参照してください。
例4-3 SQLコマンドの入力
この例では、SQLコマンドを入力して実行し、各従業員の従業員番号、名前、職種および給与をEMP_DETAILS_VIEWビューに表示します。
4.4.1 SQLコマンドの構文について
話し言葉に、単語を組み合せて文にする方法を規定する構文規則があるように、SQL*Plusにも、単語を組み合せてコマンドにする方法を規定する構文規則があります。 このようなコマンドをSQL*Plusで実行するには、それらの規則に従う必要があります。
4.4.1.1 1つのSQLコマンドの複数行への分割について
SQLコマンドは、個々の単語の途中で改行しないかぎり、任意の位置で複数行に分割できます。したがって、例4-3で入力した問合せは、次のように3行で入力できます。
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID FROM EMP_DETAILS_VIEW WHERE SALARY>12000;
このマニュアルでは、ほとんどのSQLコマンドが句に分割されており、1つの句が1行になっています。たとえば、例4-3では、SELECT句とFROM句が個別の行に配置されています。多くの場合、これが最も見やすい方法ですが、コマンドを自分にとって最も読みやすくするためには、どのように行を分割してもかまいません。
4.4.1.2 SQLコマンドの終了について
SQLコマンドは、次に示す3つの方法のいずれかによって終了できます。
-
セミコロン(;)を入力する
-
1行にスラッシュ(/)のみを1つ入力する
-
空白行を入力する
セミコロン(;)は、コマンドを実行することをSQL*Plusに通知するために使用します。例4-3に示すように、コマンドの最終行の末尾にセミコロンを入力して、[Return]を押すか「実行」をクリックします。SQL*Plusによって、コマンドが処理され、SQLバッファに格納されます。詳細は、「SQLバッファ」を参照してください。セミコロンを入力する前に誤って[Return]を押した場合は、コマンドの次の行の入力を促す行番号がSQL*Plusプロンプトに表示されます。コマンドを実行するには、セミコロンを入力して、再度[Return]を押すか「実行」をクリックします。
スラッシュ(/)のみの行を使用しても、SQL*Plusにコマンドの実行を指示できます。コマンドの最終行の末尾で[Return]を押します。SQL*Plusプロンプトに次の行の行番号が表示されます。スラッシュを入力し、再度[Return]を押すか「実行」をクリックします。SQL*Plusで、コマンドが実行され、バッファに格納されます。
SQL文またはスクリプト内に空白行を使用すると、コマンド入力の終了後、SQL*Plusでそのコマンドの実行が待機されます。コマンドの最終行の末尾で[Return]を押します。SQL*Plusプロンプトに次の行の行番号が表示されます。
ノート:
SET SQLBLANKLINESコマンドを使用して、SQL文内での空白行の表示形式および動作を変更できます。空白行の動作の変更方法の詳細は、「SET」コマンドを参照してください。
このようにコマンドを実行するには、再度[Return]を押して、SQL*Plusのコマンド・プロンプトを表示します。コマンドは、実行されないままSQLバッファに格納されます。詳細は、「SQLバッファ」を参照してください。引き続き別のSQLコマンドを入力すると、バッファ内にある前のコマンドは上書きされます。
4.5 PL/SQLブロックの実行について
データベース内のデータを操作するためにPL/SQLサブプログラム(ブロック)を使用することもできます。個々のPL/SQL文については、『Oracle Database PL/SQL言語リファレンス』を参照してください。
SQL*Plusでは、SQLコマンドと同じ方法でPL/SQLサブプログラムを処理できますが、セミコロン(;)または空白行でブロックを終了および実行できません。PL/SQLサブプログラムを終了するには、新しい行にピリオド(.)のみを入力します。新しい行にスラッシュ(/)のみを入力しても終了および実行が可能です。
PL/SQL文を入力するためのモードに入る方法は、次のとおりです。
-
DECLAREまたはBEGINを入力します。この方法でPL/SQLモードに入った後、残りのPL/SQLサブプログラムを入力します。
-
ストアド・プロシージャを作成するSQLコマンド(CREATE PROCEDUREなど)を入力します。この方法でPL/SQLモードに入った後、作成するストアド・プロシージャを入力します。
入力したサブプログラムは、SQLバッファに格納されます。RUNコマンドまたはスラッシュ(/)を入力して、現行のサブプログラムを実行します。セミコロン(;)はPL/SQLサブプログラムの一部とみなされるため、コマンドは実行されません。
処理のために(SQLコマンドの場合と同様に)、PL/SQLサブプログラム全体がSQL*PlusからOracle Databaseに送信されます。詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
たとえば、次のようなPL/SQLサブプログラムを入力して実行できます。
DECLARE x NUMBER := 100; BEGIN FOR i IN 1..10 LOOP IF MOD (i, 2) = 0 THEN --i is even INSERT INTO temp VALUES (i, x, 'i is even'); ELSE INSERT INTO temp VALUES (i, x, 'i is odd'); END IF; x := x + 100; END LOOP; END; . /
4.5.1 ストアド・プロシージャの作成について
ストアド・プロシージャは、PL/SQLのファンクション、パッケージまたはプロシージャです。ストアド・プロシージャを作成するには、次のSQLのCREATEコマンドを使用します。
-
CREATE FUNCTION
-
CREATE LIBRARY
-
CREATE PACKAGE
-
CREATE PACKAGE BODY
-
CREATE PROCEDURE
-
CREATE TRIGGER
-
CREATE TYPE
これらのいずれかのコマンドを入力すると、PL/SQLモードに入り、PL/SQLサブプログラムを入力できます。詳細は、PL/SQLブロックの実行についてを参照してください。PL/SQLサブプログラムの入力終了後、ピリオド(.)のみの行を入力してPL/SQLモードを終了します。SQLコマンドを実行し、ストアド・プロシージャを作成するには、RUNまたはスラッシュ(/)を入力する必要があります。セミコロン(;)を入力すると、CREATEコマンドは実行されません。
CREATEコマンドを使用してストアド・プロシージャを作成する場合、コンパイル・エラーが発生するとメッセージが表示されます。それらのエラーを表示するには、SHOW ERRORSを使用します。たとえば:
SHOW ERRORS PROCEDURE ASSIGNVL
詳細は、「SHOW」を参照してください。
ストアド・プロシージャを参照するPL/SQL文を実行するには、SQL*PlusのEXECUTEコマンドを使用します。EXECUTEは、このコマンドの直後に入力されたPL/SQL文を実行します。たとえば:
EXECUTE EMPLOYEE_MANAGEMENT.NEW_EMP('BLAKE')
詳細は、「EXECUTE」を参照してください。
4.6 SQL*Plusコマンドの実行
SQL*Plusコマンドを使用して、SQLコマンドおよびPL/SQLブロックを操作し、問合せ結果の書式を設定して出力できます。SQL*Plusでは、SQL*PlusコマンドはSQLコマンドやPL/SQLブロックとは異なる方法で処理されます。
コマンド入力を簡略化するために、多くのSQL*Plusコマンドで略称を使用できます。すべてのSQL*Plusコマンドの情報および略称については、「SQL*Plusコマンド・リファレンス」を参照してください。
例4-4 SQL*Plusコマンドの入力
この例では、SQL*Plusコマンドを入力して、サンプル・ビューEMP_DETAILS_VIEWのSALARY列の表示に使用する書式を変更する方法を示します。
COLUMNコマンドによって、SALARY列がドル記号($)およびカンマ(,)を使用する書式に設定され、新しいヘッダーが付けられます。
4.6.1 SQL*Plusコマンドの構文について
SQL*Plusコマンドの構文は、SQLコマンドまたはPL/SQLブロックとは異なります。
SQL*Plusコマンドは、必ずしもセミコロンで終了する必要はありません。コマンドの入力終了後、[Return]を押すか「実行」をクリックします。SQL*Plusコマンドは、必ずしもセミコロンで終了する必要はありません。
4.6.1.1 長いSQL*Plusコマンドを次の行に続ける方法について
長いSQL*Plusコマンドは、行末にハイフン(-)を付けて[Return]を押すと、次の行に続けて入力できます。必要な場合は、ハイフンの前に空白も入力できます。SQL*Plusでは、右山カッコ(>)が次の行のプロンプトとして表示されます。
たとえば:
COLUMN SALARY FORMAT $99,999 - HEADING 'MONTHLY SALARY'
SQL*Plusでは、ハイフンは継続文字として識別されるため、SQL文内でハイフンを入力すると無視されます。SQL*Plusでは、入力処理で行が結合された後にハイフンが削除されるまで、その文はSQL文として識別されません。たとえば、次のように入力します。
SELECT 200 - 100 FROM DUAL;
次のエラーが戻されます。
SELECT 200 100 FROM DUAL
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
文が正しく解釈されるように、最初の行の末尾から2行目の先頭へハイフンを移動させます。
4.7 コマンドの実行に影響するシステム変数
SQL*PlusのSETコマンドを使用して、SET変数またはシステム変数と呼ばれる多くの変数を指定できます。SET変数およびシステム変数は、SQL*Plusコマンドの実行方法に影響します。システム変数には、出力のデフォルトの列幅、コマンドによって選択されたレコード数の表示、ページ・サイズなどのSQL*Plus内の様々な条件を指定できます。
このマニュアルの例は、システム変数をデフォルトの設定にしてSQL*Plusを実行することを前提としています。システム変数の設定によっては、例に示す出力とは少し異なる出力が表示される場合があります。(コンピュータにSQL*PlusのLOGINファイルが存在する場合は、デフォルトの設定と異なる可能性があります。)
システム変数およびそれらのデフォルト設定の詳細は、「SET」コマンドを参照してください。SQL*PlusのLOGINファイルの詳細は、「SQL*Plusの構成」および「SQLPLUSプログラムの構文」を参照してください。
システム変数の現行の設定を表示するには、SHOWを入力し、その後に変数名を入力します。SHOWを使用して表示できるその他の項目の詳細は、「SHOW」コマンドを参照してください。
4.8 実行中のコマンドの停止について
50ページのレポートの1ページ目を表示した後、残りのページは表示の必要がないと判断したとします。この場合は、「取消」を押します。通常、システムの割込み文字は、[Ctrl]+[C]です。SQL*Plusは表示を停止します。
ノート:
「取消」を押しても、SQL*PlusのSPOOLコマンドのOUT句でプリンタに送信したファイルの出力は停止しません。(「 SQL*Plusレポートの書式設定」で、問合せ結果の出力について学習します。)ファイルの出力は、オペレーティング・システムから停止できます。詳細は、ご使用のオペレーティング・システム固有のインストレーション・ガイドおよび管理者リファレンスを参照してください。
4.9 オペレーティング・システムのコマンドの実行について
SQL*Plusのコマンド・プロンプトからオペレーティング・システムのコマンドを実行できます。このコマンドは、既存のオペレーティング・システム・ファイルの表示などの作業を実行する場合に有効です。
オペレーティング・システムのコマンドを実行するには、SQL*PlusのHOSTコマンドに続けて、オペレーティング・システムのコマンドを入力します。たとえば、SQL*Plusコマンドで、次のDIRECTORY *.SQLコマンドを実行できます。
HOST DIRECTORY *.SQL
コマンドの実行が終わると、再度SQL*Plusのコマンド・プロンプトが表示されます。
ノート:
HOSTコマンドを使用してSQL*Plusセッションから入力したオペレーティング・システムのコマンドは、現行のSQL*Plusセッションに影響を与えません。たとえば、オペレーティング・システムの環境変数を設定しても、現行のSQL*Plusセッションには影響を与えませんが、引き続き起動されるSQL*Plusセッションに影響を与える可能性があります。
HOSTコマンドへのアクセスを使用禁止にできます。HOSTコマンドを使用禁止にする方法の詳細は、「 SQL*Plusのセキュリティ」を参照してください。
4.10 表示の一時停止について
PAUSEシステム変数を使用すると、長いレポートまたは列数が多い表の定義の表示中、各ページごとに停止させて画面の内容を詳しく調べることができます。
SET PAUSEを使用して、問合せまたはレポートの各画面の表示後に出力を一時停止できます。詳細は、「SET PAU[SE] {ON | OFF | text}」を参照してください。
4.11 データベースへの変更の自動保存について
SQLのデータ操作言語(DML)コマンド(UPDATE、INSERTおよびDELETE)を使用して、データベース内に格納されている情報に対して行う変更を指定できます。これらのコマンドは、単独かPL/SQLブロック内で使用できます。それらの変更は、SQLのCOMMITコマンド、データ制御言語(DCL)またはデータ定義言語(DDL)コマンド(CREATE TABLEなど)を入力するか、自動コミット機能を使用するまで確定されません。SQL*Plusの自動コミット機能は、指定した数のSQL DMLトランザクションが成功した後に、保留中の変更をコミットします(SQL DMLトランザクションとは、UPDATE、INSERT、DELETEのいずれかのコマンドまたはPL/SQLブロックのことです)。
自動コミット機能は、SQL*PlusのAUTOCOMMITシステム変数で指定します。AUTOCOMMITの設定にかかわらず、変更はSQL*Plusが正常に終了するとコミットされます。
COMMIT COMPLETE
自動コミット機能をONにした場合は、データベースへの変更をロールバックできません。
SQLのDMLコマンドを、一定の回数(たとえば、10回)実行した後にデータベースへの変更をコミットする場合は、次のように入力します。
SET AUTOCOMMIT 10
SQL*Plusでは、SQLのDMLコマンドが実行されるたびにカウントされ、10コマンドごとに変更がコミットされます。
ノート:
この機能では、ブロックに含まれているSQLコマンドの実際の数には関係なく、1つのPL/SQLブロックが1つのトランザクションとみなされます。
自動コミット機能を再度OFFにするには、次のコマンドを入力します。
SET AUTOCOMMIT OFF
AUTOCOMMITがOFFに設定されたことを確認するには、次の形式でSHOWコマンドを入力します。
SHOW AUTOCOMMIT
AUTOCOMMIT OFF
詳細は、「SET AUTO[COMMIT]{ON | OFF | IMM[EDIATE] | n}」を参照してください。
例4-5 自動コミット機能をONにする方法
自動コミット機能をONにするには、次のように入力します。
SET AUTOCOMMIT ON
次のように入力することもできます。
SET AUTOCOMMIT IMMEDIATE
AUTOCOMMITの設定を変更するまで、データベースへの変更を指定するSQLの各DMLコマンドからの変更は、SQL*Plusで自動的にコミットされます。SQL*Plusでは、自動コミットを実行するたびに次のメッセージが表示されます。
4.12 エラー・メッセージの解釈について
SQL*Plusでコマンド内にエラーが検出された場合は、エラー・メッセージが表示されます。 SQL*Plusエラー・メッセージのリストについては、「SQL*Plusのエラー・メッセージ」を参照してください。
SP2-0310: unable to open file "emplyyes.sql"
多くの場合、メッセージを読むだけで問題の修正方法がわかります。詳しい説明が必要な場合は、問題の原因および修正方法を判断するため、次のいずれかのステップを実行します。
-
エラー・メッセージが「SP2」という文字で始まる番号付きのものである場合は、「SQL*Plusのエラー・メッセージ」でSQL*Plusメッセージを検索してください。
-
エラー・メッセージが「CPY」という文字で始まる番号付きのものである場合は、「COPYコマンドのメッセージ」でSQL*PlusのCOPYコマンド・メッセージを検索してください。
-
エラー・メッセージが、「ORA」という文字で始まる番号付きのものである場合は、『Oracle Databaseエラー・メッセージ』またはご使用のオペレーティング・システムのプラットフォーム固有のOracleドキュメントで、Oracle Databaseメッセージを検索してください。
-
エラー・メッセージが「PLS」という文字で始まる番号付きのものである場合は、『Oracle Database PL/SQL言語リファレンス』で、Oracle Databaseメッセージを検索してください。
エラー・メッセージに番号が付いていない場合は、エラーとなったコマンドの正しい構文を検索するため、SQL*Plusコマンドについては「SQL*Plusコマンド・リファレンス」、SQLコマンドについては『Oracle Database SQL言語リファレンス』、PL/SQLブロックについては『Oracle Database PL/SQL言語リファレンス』を参照してください。それ以外の場合は、DBAに問い合せてください。
例4-6 エラー・メッセージの解釈
次のように入力して、存在しないファイルまたは使用可能でないファイルを実行しようとしたとします。
START EMPLYYES.SQL
次のエラー・メッセージは、表が存在しないことを示します。