linuxやWindows上で動いているOracle9iのSQL*Plusのメモです。
|
|
sqlplusの引数にユーザー名を指定すると、そのユーザーでログオン(接続)する。[2008-02-20]
ユーザーの指定形式は「ユーザー」「ユーザー/パスワード」「ユーザー/パスワード@接続名」「ユーザー@接続名」等。
パスワードを指定していない場合は別途パスワードの入力が求められる。
接続名(サービス名)を省略した場合はデフォルトの接続先になる。
存在しないユーザーだったりパスワードが違ったり接続名が認識できなかったり間違っていたりするとエラーとなり、再度ユーザー名とパスワードの入力が要求される。(-Lオプションを指定していない場合)
ここではユーザー名とパスワードしか聞かれないので接続名が指定できないような感じがするが、ユーザー名の直後に「@接続名」を付ければOK。
> sqlplus scotttttt/tiger@ora92 ERROR: ORA-01017: invalid username/password; logon denied ユーザー名を入力してください: scott パスワードを入力してください: tiger ERROR: ORA-12154: TNS: サービス名を解決できませんでした。 ユーザー名を入力してください: scott@ora92 パスワードを入力してください: tiger
また、「as sysdba」も同様にユーザー名の入力時に指定できる。
> sqlplus sys/manager ERROR: ORA-28009: connection to sys should be as sysdba or sysoper ユーザー名を入力してください: sys as sysdba パスワードを入力してください: manager
※要するにただ単にconnectコマンドが裏で実行されているだけっぽい。
ユーザー名を入力してください: scott --foo SP2-0306: オプションが無効です。 使用方法: CONN[ECT] [logon] [AS {SYSDBA|SYSOPER}]
オプション | 説明 | 備考 | 更新日 |
---|---|---|---|
-s | サイレントモード | プロンプトやログインメッセージを表示しなくなる。 | 2006-07-08 |
-L | ログインを1回だけ行う。 | 通常、ログインに失敗すると3回まで再試行するが、このオプションを付けると1回で終了する。 | 2006-07-08 |
/nolog | DBの起動・終了等を行うときに使う。 | Oracle8i以前の sqlmgrl に相当するものらしい | |
"sys/manager@SID as sysdba" | DB管理者としてログインする。ユーザーの作成等に使う。 | sys:DB管理者 manager:パスワード |
|
'ユーザー/パスワード' | 指定したユーザーでログインする。 | ユーザー名にハイフン「-」等が入る場合は、ダブルクォーテーションで囲む。つまり「'"test-1"/password' 」といった形になる。 |
|
@ファイル名 | ファイル内に書かれたSQL(複数可)を実行する。 | 例: sqlplus '"test-1"/password' @test.sql |
(nolog以外で)ユーザー・パスワードを指定しなかった場合、別途聞かれる。ここでも、ユーザー名にハイフン「-」が入る場合はダブルクォーテーションで囲むこと。
$ sqlplus ユーザー名を入力して下さい:"test-1" パスワードを入力して下さい:password
エクスポートを行う。
インポートを行う。
新しいバージョンのexp/impでは、古いバージョンのDBに対してエクスポート・インポートをする事が出来ない。[2008-12-17]
DBのバージョンに合ったコマンドを使う必要がある。
$ exp hishidama/hishidama owner=hishidama file=exp.dmp $ imp hishidummy/hishidummy fromuser=hishidama touser=hishidummy file=exp.dmp
Oracle10gでハッシュパーティション化されたテーブルをエクスポートしたファイルは、バグっていてインポートできない。[2008-12-17]
そういう時はDDLだけは別の方法(例えばSQL Developerのexport)を使い、データだけimpでインポートするといいかも。
ダンプファイルの中にDDLも入っているので
インポート時に“オブジェクトが既にある”というエラーにはなるが、「ignore=y」オプションを付けておけば無視して続行される。
(INSERT時の重複(duplicate)エラー等も無視して続行される)
> imp hishidummy/hishidummy fromuser=hishidama touser=hishidummy file=exp.dmp ignore=y
Windows版のSQL*Plusでは、ログオン用のダイアログが開く。[2005-05-27]
この「ユーザー名(U)」に「/nolog」「/as
sysdba」「sys/password@ora92 as sysdba」と入れてやれば、コマンドライン版のsqlplusからそれぞれその引数を指定したのと同じになる。
ただし「ホスト文字列(H)」には何も入れてはいけない。
要するにここで指定した文字列をそのまま引数に渡しているみたいなんだな^^;
このWindows版のSQL*Plus(sqlpluswコマンド)は、Oracle11gで廃止になったらしい。[2008-01-13]
コマンドプロンプトから実行するsqlplusコマンドは残っているみたいだけど、桁数変更やコピー&ペーストや中断の利便性が全然違うからなぁ…。
代わりにSQL Developerを使えという事なのだろうか。[2008-12-17]
sql*plusの実行ファイルと同じ場所に「login.sql」というファイルを作っておくと、起動時にそのファイルが読み込まれる。[2006-11-21]
このファイルの中に書いたSQLが実行される。
セッションパラメータを初期化するのに便利。
SQL*Plusのコマンドはhelpコマンドで概要を見ることが出来る。
SQL*Plusのバッファには実行したSQLが入っており(SHOWやDESCといったSQL*Plusのコマンドは入らない)
、
バッファの内容を編集したり再実行したりすることが出来る。→バッファ編集
SQL*Plusのコマンド(とSQL文)は、行の末尾に「-(ハイフン1つ)」を付けることで次の行に継続して入力できる。[2007-12-30]
これで継続した行は、入力後には1行として扱われる。
SQL文を書いて末尾に「;
(セミコロン。sqlterminatorで変更可能)」を付けてリターンキーを押すと、SQL文がバッファに格納され、実行される。[2008-01-14]
セミコロンを書かずに「.
(ピリオド。blockterminatorで変更可能)」のみの行を書いてリターンキーを押すと、実行されずにバッファへの格納のみ行われる。
(でもこれってCtrl+Cで中断するのと同じような? Ctrl+Cでもそれまでに書いた内容はバッファに入るし…)
コマンド | 説明 | 備考 | 更新日 | |
---|---|---|---|---|
SQL文 | SQLを実行する。 | 最後尾に「; (セミコロン)」が必要。コピー&ペーストで貼り付けられる量に制限があるので、大量のSQLを実行したい場合は「SQL*Plus」ではなく「SQL*Plus Worksheet」を使うとよい。 |
2006-11-21 | |
EXIT 〔戻り値〕 | sqlplusを終了する。 | 「exit 戻り値」…戻り値を返す。 「exit 戻り値 COMMIT」…コミットして終了する。 「exit 戻り値 ROLLBACK」…ロールバックして終了する。 |
2006-07-08 | |
DESCRIBE テーブル名 | DESC | テーブルの情報を表示する。 | テーブル一覧が見たければ、「select table_name from user_tables; 」 |
|
@ファイル名 | ファイル内のSQL(複数可)を実行する。 →ファイル名の指定 |
別サーバーにあるファイルを実行しているとき、ローカルからファイルを探す。 | ||
@@ファイル名 | 別サーバーにあるファイルを実行しているとき、そこと同じ場所からファイルを探す。 | 2006-07-08 | ||
START ファイル名 | 2006-11-22 | |||
SPOOL ファイル名 | SPO | このコマンドの実行後、sqlplusの実行結果がファイルに保存される。 | CSV出力に利用できる。 「 spool off 」で、保存をやめる。 |
2004-10-02 |
CLEAR オプション | CL | クリアする。 | 例えば「CLEAR SCREEN 」「CL SCR 」で画面を消去する。 |
2007-12-30 |
ユーザー関連 | ||||
CONNECT | CONN | 接続先を変更する。(現在の接続を切ってから新しい接続を行う) | 「conn user/password 」「conn as sysdba 」「 conn /@SID as sysdba 」 |
2005-05-27 |
DISCONNECT | DISC | 接続を終了(切断)する。 | 2007-12-30 | |
SHOW USER | SHO | 現在ログオン中のユーザーの情報を表示する。 | 似たものに「select user from dual; 」他に「 select * from user_users; 」「select * from all_users; 」 |
|
PASSWORD 〔ユーザー名〕 | PASSW | パスワードを(対話式で)変更する。 | ユーザー名を指定しない場合、現在ログオンしているユーザー。 他のユーザーのパスワードを変えるにはsysdbaでないとダメ。 SQLなら「 alter user ユーザー名 identified by "新パスワード"; 」 |
2007-12-30 |
バッファ編集 | ||||
GET ファイル名 | ファイルの内容をバッファにコピーする。 | |||
SAVE ファイル名 | SAV | バッファの内容をファイルに保存する。 | ||
数字 | 指定された数字(行番号)の行を、バッファのカレント行とする。 | |||
数字 文字列 | 指定された数字(1以上)の行を、文字列に置き換える。 | |||
0 文字列 | バッファの一番先頭の行の前に文字列を挿入する。 | 2008-04-26 | ||
APPEND 文字列 | A | バッファのカレント行に文字列を追加する。 | ||
CHANGE/前/後 | C | バッファのカレント行内で文字列の置換を行う。 | ||
DEL | バッファのカレント行を削除する。 | |||
INPUT | I | バッファのカレント行の次行に新しい行を追加する。 | ||
LIST | L | バッファの内容を表示する。 | ||
LIST 行番号 〔行番号〕 DEL 行番号 〔行番号〕 |
L |
指定された行に対して処理を行う。 行番号をスペース区切りで2つ指定すると、開始行〜終了行として扱われる。 |
行番号に「*」を指定すると、カレント行が対象となる。 行番号に「last」を指定すると、最終行が対象となる。 |
2008-04-26 |
RUN | R | バッファの内容を表示後、再実行する。 | ||
/ | (バッファの内容を表示せず)再実行する。 | |||
SQL*Plusの設定 (→環境変数・セッションパラメータ) | ||||
HELP コマンド | ? | sqlplusのコマンドのヘルプを表示する(DBに接続していないと表示されない)。 コマンドの先頭が一致するもの全てが表示される。 |
例:「help set 」…SETコマンドの説明が表示される。例:「 ? s 」…Sから始まる全コマンドの説明が表示される。「 help index 」…SQL*Plusのコマンド一覧が表示される。「 help topic 」…helpで表示できる内容一覧が表示される。→バージョンの不一致に注意 |
2007-12-30 |
SHOW システム変数 | SHO | sqlplusのシステム変数の値を表示する。 | 「show all 」で、全てのシステム変数の値を表示する。→OTNのSHOW |
2009-01-06 |
SET システム変数 値 | sqlplusのシステム変数の値を変更する。 | 2004-10-02 | ||
STORE SET ファイル名 〔REP〕 | 全てのシステム変数をファイルに出力する。 | sqlplusの実行ファイルと同じ場所に出力される。このファイルはsetを使っており、SQLファイルとして実行できる。 | 2006-11-22 | |
COLUMN | COL | 項目(データ列)の書式を設定・表示する。 | 2008-02-15 | |
WHENEVER 〔定義〕 | エラー発生時の動作の定義する。 何も定義を書かないと、現在の定義を表示する。 |
whenever {OSERROR | SQLERROR }
{EXIT系 | CONTINUE系 }; EXIT系… EXIT 〔戻り値 〕 〔COMMIT | ROLLBACK 〕CONTINUE系… CONTINUE 〔COMMIT | ROLLBACK | NONE 〕 |
2006-07-08 | |
TIMING オプション | TIMI | 累計の経過時間を1/100秒単位で表示させる。 「start ラベル」で、時間計測を開始。 「show」で、その時点の経過時間を表示。 「stop」で終了(最終的な経過時間を表示)。 これとは別に、TIMINGというシステム変数もある。これをONにしておくと、SQLを実行する度に実行に要した時間が表示される。 |
SQL> timing start aaa SQL> 何らかのSQL群を実行 SQL> timing show aaaのタイミング。 経過: 00:00:10.09 SQL> timing stop aaaのタイミング。 経過: 00:00:12.07 SQL> timi stop SP2-0325: stopに対するタイミング要素はありません。 SQL> set timing on SQL> 何らかのSQLを実行 経過: 00:00:00.01 |
2006-06-03 |
DEFINE 変数〔=値〕 | DEF | 置換変数の表示・設定を行う。 | 引数を何も指定しないと、全変数を表示する。 →使用例 |
2006-07-08 |
UNDEFINE 変数 | UNDEF | 置換変数を削除する。 | 2007-12-30 | |
ACCEPT 変数 | ACC | 置換変数をユーザー入力で設定する。 | →使用例 | 2008-04-26 |
VARIABLE 〔変数 〔型〕〕 | VAR | バインド変数を定義・表示する。 | 2007-12-30 | |
PRINT 〔変数…〕 | バインド変数の値を表示する。 | 2007-12-30 | ||
EXECUTE | EXEC | PL/SQLを実行する。 | BEGINやCALLはsqlplusのコマンドではなくSQLの文なのでsqlplusのバッファに入る。 EXECはsqlplusのコマンドなのでバッファに入らない。 |
2007-12-30 |
DBMS操作 | ||||
STARTUP | DBを起動する。 | 「startup mount 」…マウントだけ実行? |
2005-05-27 | |
SHUTDOWN | DBを停止する。 | 「shutdown 」「shutdown normal 」…全てのセッションが終わるまで待つ「 shutdown immediate 」…トランザクションをロールバックする |
2008-08-23 | |
その他 | ||||
PROMPT メッセージ | PRO | メッセージを表示する。 | DOSやUNIXのechoコマンドに相当。 | 2008-04-26 |
HOST コマンド | ローカルの(SQL*Plusを実行している)OS(DOSやUNIX)のコマンドを実行する。 | Windows版SQL*Plusの場合、別途コマンドプロンプトが開いて実行され、終わると閉じてしまう(ので結果が確認できない)。 そのため、複数区切り&を使ってpauseコマンドを付加してやると良い。 ただし「&」はデフォルトで置換変数なので、置換変数をオフにしたり別の記号に変えたりエスケープ文字を使ったりする必要がある。 SQL> host cd & pause |
2008-04-26 |
ヘルプの内容は、SQL*Plusが接続している“接続先のDB”から内容をとってきているような雰囲気。[2008-02-05]
つまり、実際にそのバージョンのSQL*Plusで使えるコマンドと、ヘルプで表示される内容が一致しない事がある。
例えばOracle9iのSQL*PlusからOracle10gのデータベースへつないでいる場合、「help show」は以下のような情報が表示される。
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION | PROCEDURE | PACKAGE | PACKAGE BODY | TRIGGER
| VIEW | TYPE | TYPE BODY | DIMENSION | JAVA CLASS} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
RECYC[LEBIN] [original_name]
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TT[ITLE]
USER
リサイクルビンに関するシステム変数(RECYCLEBIN)がヘルプに表示されているが、実際はOracle10gのSQL*Plusでないと使えない。
(Oracle9iのSQL*Plusでは、使おうとするとエラーになってしまう)
この書式で接続する場合、接続先のSIDは環境変数ORACLE_SIDで指定されているものになる。[2005-05-27]
DBが起動している場合、ORACLE_SIDを指定していなくても、以下の書式で接続できる。
SQL> conn /@orcl10g as sysdba Connected.
起動していないと、以下のように使えない…。
SQL> shutdown Database closed. Database dismounted. ORACLE instance shut down. SQL> conn /@orcl10g as sysdba ERROR: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
@・@@・startコマンドでスクリプトファイル(SQLが書かれたファイル)を実行することが出来る。[2008-02-06]
その際はコマンドの後ろにファイル名を指定するわけだが、ここで「?」という記号は特殊な意味を持つ。
すなわち、実行しているsqlplusがインストールされている場所(ORACLE_HOME?)に変換される。
SQL> @ ?/test.sql SP2-0310: ファイル"C:\oracle\ora92/test.sql"をオープンできません
ちなみに、ファイル名指定で拡張子を省略すると、システム変数suffixで定義されている文字列(デフォルトは"sql")が自動的に付加される。
SQL> @ test SP2-0310: ファイル"test.sql"をオープンできません。
SQL> @ ? SP2-0310: ファイル"C:\oracle\ora92.sql"をオープンできません。
ついでに「@」も特殊な変換がされるようなされないような…。(バージョンによっては何も変換されない?)
SQL> @ @ SP2-0310: ファイル"ora92.sql"をオープンできません。
sql*plusの起動時に読み込まれて使われる。
環境変数 | 値 | 説明 | 関連 | 更新日 |
---|---|---|---|---|
ORACLE_HOME | Oracleがインストールされている場所を指す。 | 2005-05-27 | ||
ORACLE_SID | (例)orcl10g | デフォルトのSIDを指定する。 | 2005-05-27 | |
NLS_LANG | Japanese_Japan.JA16EUC | クライアント側に表示する文字コードの設定。 DBに入っている文字コードに関わらず、この設定で表示される。 |
2004-05-28 | |
Japanese_Japan.JA16SJIS | ||||
NLS_DATE_FORMAT | yyyy/mm/dd | DATE型の表示形式を設定する。 | SP | 2006-11-21 |
NLS_TIMESTAMP_FORMAT | yyyy/mm/dd hh24:mi:ss.ff3 | TIMESTAMP型の表示形式を設定する。 | SP | 2006-11-21 |
セッション毎に設定を行う。[2006-11-21]
セッションパラメータ | 値 | 説明 | 関連 | 更新日 |
---|---|---|---|---|
NLS_DATE_FORMAT | yyyy/mm/dd | DATE型の表示形式を設定する。 | 環境変数 | 2006-11-21 |
NLS_TIMESTAMP_FORMAT | yyyy/mm/dd hh24:mi:ss.ff3 | TIMESTAMP型の表示形式を設定する。 | 環境変数 | 2006-11-21 |
設定するには、「alter session」を使う。(commitは不要)
SQL> alter session set NLS_DATE_FORMAT='yyyy/mm/dd'; セッションが変更されました。 SQL> select sysdate from dual; SYSDATE ---------- 2006/11/21
設定内容を確認するには、NLS_SESSION_PARAMETERSやv$nls_parametersというビューを使用する。[/2006-12-26]
SQL> select * from NLS_SESSION_PARAMETERS 2 where parameter='NLS_DATE_FORMAT'; PARAMETER ------------------------------------------------------------ VALUE -------------------------------------------------------------------------------- NLS_DATE_FORMAT yyyy/mm/dd
showで照会し、setで設定する。大文字でも小文字でも指定可。 [2004-10-02]
「show all
」で全変数の内容を表示する。
「help set
」で変数一覧(超概要説明)が表示される。
システム変数 | 値 | 説明 | 更新日 | |
---|---|---|---|---|
SHOWMODE | SHOW | OFF、ON | setによって値を変更した場合に、新旧の値を表示するかどうか。 | 2008-02-20 |
HEADSEP | HEADS | 文字 | select結果の見出し(項目名)を表示する際の、各項目の区切り文字。 | |
UNDERLINE | UND | 文字、OFF | select結果の見出しに下線を引くための文字。 | |
COLSEP | 文字 | select結果の値を表示する際の、各項目の区切り文字。 | ||
HEADING | HEA | OFF、ON | select結果の見出し(項目名)を表示するかどうかを制御。 | |
FEEDBACK | FEED | 数値、OFF | select結果の「〜行が選択されました。」を、何行以上の結果があると表示するかを制御。 | |
LINESIZE | LINE | 数値 | 1行に表示される文字数。 | |
PAGESIZE | PAGES | 数値 | ページの行数。0にすると、見出し等も出なくなる。 | |
PAUSE | PAU | OFF、ON、 文字列 |
ONにすると、ページ毎にEnterキーを押さないと SQLの実行結果が表示されなくなる。(1ページはPAGESで指定した行数) | 2008-02-20 |
NULL | 文字列 | selectした結果の値がnullの時に表示する文字列。 | ||
NUMFORMAT | NUMF | 数値書式 | select結果の数値を表示する際の書式。 | 2008-02-15 |
ECHO | OFF、ON | ファイル(スプール)出力において、実行したSQL文も出力するかどうかを制御。(onのとき、出力する) | 2006-11-22 | |
TRIMSPOOL | TRIMS | ON、OFF | ファイル(スプール)出力において、各行の端のスペースを出すかどうかを制御。 (onのとき、スペースを出力しない) | |
TERMOUT | TERM | OFF、ON | コマンドファイルから実行したコマンドの実行結果を表示(端末出力)するかどうかを制御。(onのとき、出力する) | |
USER | 参照のみ | 現在ログイン中のユーザー名を表示。 | 2005-05-15 | |
ERRORS | ERR | 参照のみ | FUNCTIONやPROCEDUREやユーザー定義型を定義した際のエラー内容を表示。 | 2005-05-15 |
SQLCODE | 参照のみ | 直前に実行したSQLの結果(戻り値)を表示。 | 2008-02-05 | |
RECYCLEBIN | RECYC | 参照のみ | (Oracle10gで導入された)リサイクルビンに入っているオブジェクトを表示。 (sqlplus自身のバージョンがOracle10gでないと使えない) |
2005-06-26 |
PARAMETERS | PARAMETER | 参照のみ | DBMSのパラメーターを表示する。 sysdbaのユーザーでのみ使用可能。 |
2009-01-06 |
TIME | TI | OFF、ON | ONにすると、プロンプトの「SQL>」の左側に現在時刻を表示する。 | 2007-10-30 |
TIMING | TIMI | ON、OFF | ONにすると、SQL実行の終了時に経過時間を1/100秒単位で表示する。 これとは別に、timingというコマンドもある。 |
2006-06-03 |
DEFINE | DEF | 文字、ON、OFF | 置換変数で使う文字。OFFだと置換変数を使用できなくなる。ONだとデフォルトの「&」になる。 | 2006-07-08 |
VERIFY | VER | ON、OFF | 置換変数を使った場合に、新旧の値を表示するかどうか。 | 2008-02-20 |
CONCAT | CON | 文字、OFF、ON | 置換変数の結合に使用する文字。デフォルトは「. (ピリオド)」。 |
2008-04-26 |
ESCAPE | ESC | 文字、OFF、ON | 識別子や文字列のエスケープに使用する文字。→使用例 例えば置換変数で使う文字をエスケープして、置換変数の文字そのものを出せるようになる。 |
2007-06-26 |
RELEASE | REL | 参照のみ | 接続先DBのバージョンを表示。 | 2008-02-05 |
SQLPROMPT | SQLP | 文字列 | SQL*Plusのプロンプト。デフォルトは「SQL>」 | 2008-01-14 |
SQLNUMBER | SQLN | ON、OFF | 複数行にまたがってSQL文を書く場合のプロンプトに行番号を出すかどうか。 OFFにすると出なくなるが、非常に分かりにくくなる(苦笑) |
2008-01-14 |
SQLCONTINUE | SQLCO | 文字列 | 行の末尾に「-(ハイフン)」を付けて行を継続した際に表示されるプロンプト。デフォルトは「> 」 | 2008-01-14 |
SQLTERMINATOR | SQLT | 文字 | SQL文の末尾を示す文字。デフォルトは「; (セミコロン)」。 |
2008-01-14 |
BLOCKTERMINATOR | BLO | 文字 | SQLを実行せずにバッファへ格納することを示す文字。デフォルトは「. (ピリオド)」。 |
2008-01-14 |
SUFFIX | SUF | 文字列 | スクリプトファイルのデフォルトの拡張子。 | 2008-02-06 |
SERVEROUTPUT | SERVEROUT | OFF、ON | dbms_outputを使用したメッセージ出力の表示有無を制御。→使用例 | 2007-06-26 |
AUTOTRACE | AUTOT | OFF、ON、 TRACEONLY |
「ON EXP」にすると、SQLの実行結果を表示した後に実行計画を表示する。 「TRACE EXP」にすると(実行結果を表示せずに)実行計画だけ表示する。 |
2007-12-30 |
SQL*PlusのコマンドやSQL文の実行時にメッセージを表示し、文字列部分に値を入力できる。[2006-07-08]
「&文字列」の部分が、入力した値に置き換えられる。(「&」はデフォルトであり、DEFINEによって変えられる)
(置換変数の文字そのものを表示したい場合は、エスケープ文字を使用する。[2007-06-26])
SQL> select '&var&hoge' from dual; varに値を入力してください: aa hogeに値を入力してください: bb 旧 1: select '&var&hoge' from dual 新 1: select 'aabb' from dual 'AAB ---- aabb
SQL> select &col from emp; colに値を入力してください: empno 旧 1: select &col from emp 新 1: select empno from emp EMPNO ---------- 7369 〜
PL/SQLにも使用可能。
「&」1つだと、置換変数に値をセットしない限り、実行時に何度でも値の入力を求められる。[2008-04-26]
「&&」の様に2つにすると、一度目で入力した値がその置換変数に保持され、二度目からはその値が使用される。
SQL> select &&col from emp;
また、SQL*Plusの起動時にファイルを読み込んで実行する場合、引数を指定することが出来る。
これは「&数値」という形になり、&1が1番目の引数を表す。
test.sql:
spool &1 select '引数2は&2' as 引数2 from dual; exit
>sqlplus -s hishidama @test.sql zzz.txt arg2 旧 1: select '引数2は&2' as 引数2 from dual 新 1: select '引数2はarg2' as 引数2 from dual 引数2 ----------- 引数2はarg2
→spool命令の引数もちゃんと置換されるので、zzz.txt
にも同じ内容が出力される。
ここで引数が無かった場合にその番号(例えば上記では&3)を使うと、&文字列と同じく値の入力が要求される。
defineコマンドを使うと、現在定義されている置換変数を知ることが出来る。
SQL> define DEFINE _CONNECT_IDENTIFIER = "ora92" (CHAR) …暗黙に色々定義されているらしい DEFINE _SQLPLUS_RELEASE = "902000100" (CHAR) DEFINE _EDITOR = "Notepad" (CHAR) DEFINE _O_VERSION = "Oracle9i Release 9.2.0.1.0 - Production …バージョンっぽいのもある。v$versionと関係あるのかな? JServer Release 9.2.0.1.0 - Production" (CHAR) DEFINE _O_RELEASE = "902000100" (CHAR) DEFINE 1 = "zzz.txt" (CHAR) …起動時の引数もある DEFINE 2 = "arg2" (CHAR)
defineコマンドによって値を定義しておくと 使用時に値の入力が要求されなくなり、定義した値が使われる。
SQL> select '&var' from dual; varに値を入力してください: zzz …最初は定義されていないので、値の入力が要求される 旧 1: select '&var' from dual 新 1: select 'zzz' from dual 'ZZ --- zzz SQL> def var=abc …値を定義する SQL> def var …定義した値の確認 DEFINE VAR = "abc" (CHAR) SQL> r 1* select '&var' from dual 旧 1: select '&var' from dual …値の入力が要求されずに置換が実行される 新 1: select 'abc' from dual 'AB --- abc
ピリオドは置換後の文字列との結合に使える。[2008-04-26]
(ピリオドはデフォルト値であり、システム変数CONCATによって変更可能)
SQL> select &var.no from emp; varに値を入力してください: dept 旧 1: select &var.no from emp 新 1: select deptno from emp DEPTNO ---------- 20 〜
システム変数のverifyをoffにすれば、置換時の旧・新の情報は表示されなくなる。[2008-02-20]
SQL> set ver off SQL> select '&var' from dual; varに値を入力してください: zzz 'ZZ --- zzz
acceptコマンドを使うと、ユーザーからの入力によって置換変数の値をセットすることが出来る。[2008-04-26]
SQL> accept var
zzz
acceptではオプションを指定することが出来る。(defineでは出来ない)
オプション | 概要 | |
---|---|---|
NUMBER CHAR DATE |
NUM |
変数の属性 |
FORMAT 書式 | FOR | 書式 |
DEFAULT 規定値 | DEF | 入力が省略された場合(Enterのみ押した場合)の値 |
PROMPT プロンプト NOPROMPT |
NOPR |
ユーザーへの入力を促すメッセージの指定 |
HIDE | ユーザーの入力した文字が「*」で表示される。 つまりパスワードを入力するような感じになる。 |
SQL> acc var num prompt 数値を入れてください:
数値を入れてください:zzz
SP2-0425: "zzz"は有効な数値ではありません。
数値を入れてください:123
置換変数を削除するにはundefineコマンドを使う。[2007-12-30]
SQL> undef var
SQL*Plusのバインド変数とは、SQL*PlusとPL/SQLとの間で共有できる変数。[2007-12-30]
SQL*Plusで代入してPL/SQLから使ったり、PL/SQLで代入してSQL*Plusから参照したり出来る。
PL/SQLはDBサーバー上で実行されるものであり、SQL*Plusはクライアントのツール。
したがってバインド変数の使用はサーバー(PL/SQL)とクライアント(SQL*Plus)間で通信が発生するらしい。
バインド変数の定義はvariableコマンドを使う。
バインド変数への代入はexecuteコマンドによる代入文・SELECT INTO文か、call〜intoを使う。[/2008-02-06]
バインド変数の参照はprintコマンドを使う。
SQL> variable v1 char(6) SQL> execute :v1 := 'ABC' || 'DEF' PL/SQLプロシージャが正常に完了しました。 SQL> print :v1 V1 -------------------------------- ABCDEF
SQL> var v2 number SQL> exec select max(empno) into :v2 from emp PL/SQLプロシージャが正常に完了しました。 SQL> print v2 V2 ---------- 7934
SQL> var v3 char(6) SQL> call test_f('ABC') into :v3; コールが完了しました。 SQL> print v3 V3 -------------------------------- ABCABC
文法 | 説明 | 備考 |
---|---|---|
var バインド変数名 型 | バインド変数を定義する。型を変更した再定義も可能。 | 初期値はNULL。 |
var バインド変数名 | バインド変数の定義を表示する。 | |
var | 全バインド変数の定義を表示する。 | |
print バインド変数名 〔バインド変数名…〕 | バインド変数の値を表示する。 | 値がNULLの場合、「set null」で定義した文字列が表示される。 |
全バインド変数の値を表示する。 |