ホスト変数

SQL*Plus におけるホスト変数とは、ホスト環境に保管されている変数の事で PL/SQL と SQL*Plus の双方から参照できる。
ここでのホストとは「ゲスト」と「ホスト」の位置づけにすると理解しやすい。

SQL*Plus を実行している環境における「ホスト」とは SQL*Plus というクライアントプログラムのコマンド・プロセッサになり、 ホスト変数は SQL*Plus が稼動しているローカルマシンのメモリ中に存在する。

SQL*Plus 上で実行される SQL コマンド、PL/SQL ブロックは データベースサーバーの処理言語(ゲスト)となる。

ゲスト変数

(注) ゲスト変数とは、ホスト変数と対比させるために作った造語ですから誰にも通じないです。 (検索エンジンにもヒットしません)

ゲスト変数(ゲスト環境の変数)とは、SQL*Plus に招かれた?ゲスト言語環境における変数のこと。
SQL*Plus におけるホスト言語は 「SQL*Plus コマンド」に相当し、ゲスト言語とは SQL コマンド、PL/SQL ブロックとなる。

  • ホスト言語は SQL*Plus (ホスト)によって処理される。
  • ゲスト言語は データベースサーバー(ゲスト)に送出されて処理されて戻ってくる。

SQL*Plus からみて、下の書いたサンプルにおける vMsg は「ゲスト」な変数となる。(正式名称は 「PL/SQL 変数」です)
つまり、PL/SQL ブロックの内容をデータベースサーバーに送出してい結果の表示を行なっている。

ゲスト変数 vMsg を使用したプログラム

データベースサーバーで完結しているプログラム

SQL> declare
  2     vMsg   VARCHAR2(20);
  3  begin
  4     vMsg := 'Hello World';
  5     dbms_output.put_line(vMsg);
  6  end;
  7  /
Hello World
 
PL/SQLプロシージャが正常に完了しました。

ホスト変数 vMsg を使用したプログラム

SQL*Plus の vMsg 変数(メモリ)にデータベースの実行結果がバインドされる。

SQL> variable vMsg VARCHAR2(20)
SQL> begin
  2      :vMsg := sys.standard.concat('Hello', ' Word');
     --  ↑ ホスト変数には コロン(:) をつける
  3  end;
  4  /
 
PL/SQLプロシージャが正常に完了しました。
 
SQL> print vMsg;
 
VMSG
---------------------------------------------------------
 
Hello Word

sys.standard.concat の sys.standard. 部分は sys ユーザーが所有する standard という パッケージ名 をあらわし、標準関数の使用は concat だけでよい。

ホスト変数とゲスト変数の違い

次の2つのプログラムは処理する内容が同一で、結果ももちろん同じになる。しかし、稼動する環境やネットワークなどによって顕著に応答速度の違いが発生してしまうスクリプトである。

ゲスト変数を使用した文字列結合

SQL> set timing on
SQL> declare
  2     vLongStr        varchar2(4000);
  3  begin
  4     for i in 1..1000
  5     loop
  6             vLongStr := '';
  7             for i in 1..4000
  8             loop
  9                     vLongStr := vLongStr || 'a';
 10             end loop;
 11     end loop;
 12  end;
 13  /
 
PL/SQLプロシージャが正常に完了しました。
 
経過: 00:00:00.68 -- 0.68(s)

ホスト変数を使用した文字列結合

SQL> variable vLongStr varchar2(4000)
SQL> begin
  2     for i in 1..1000
  3     loop
  4             :vLongStr := '';
  5             for i in 1..4000
  6             loop
  7                     :vLongStr := :vLongStr || 'a';
  8             end loop;
  9     end loop;
 10  end;
 11  /
 
PL/SQLプロシージャが正常に完了しました。
 
経過: 00:00:03.81 -- 3.81(s)
SQL>

正式呼称はバインド変数

ここまで「ホスト変数」と言っていたものは、マニュアル上では「バインド変数 :bind variable」 と記載されていて 「ホスト変数: host variable」 の表現はみつからない。host_variable のような書式説明はある。

PL/SQL 変数と SQL*Plus で「ホスト」している変数の違いを理解したら公には「バインド変数」という正式な用語を使うようにした方が良いです。

再度になりますが、ゲスト変数と書いていたものは 「PL/SQL 変数」が正式名称です。

 


変数の使い方

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ オラクルサポートセンター