このすみノート

Webエンジニアが技術や趣味を書くブログです。

Oracle Databaseでドットを2つ書くパターンの理由を調査した

業務でOracleを使うことになるかもしれないため、検証目的でOracleの開発環境構築を進めている。

結論から言えば、まんましろ氏の記事の通りに進めて無事環境を構築し、sqlplusでSQL実行まで進めることまでできました。

その中で気になったのが、CREATE TABLE &USER_NAME..tb_sample の部分です。 なぜドットが2つになるのか。調べました。

-- テーブル作成するユーザ(変数定義)
DEFINE USER_NAME='hogeuser';

-- テーブル作成
CREATE TABLE &USER_NAME..tb_sample
(
    col1 VARCHAR2(10) NOT NULL,
    col2 VARCHAR2(50),
    col3 VARCHAR2(30),
    CONSTRAINT pk1 PRIMARY KEY(col1)
 ) 
;

&USER_NANEとは

まず &USER_NANE の箇所ですが、これは変数(定数)の代入です。

-- テーブル作成するユーザ(変数定義)
DEFINE USER_NAME='hogeuser';

-- テーブル作成
CREATE TABLE &USER_NAME..tb_sample

ここに関しては、そういうものであると理解できます。 未だ不正確な理解かもしれませんが、変数名の先頭に「&」を付ければよいという解釈で通ります。

ドットが2つになる理由

では次に、 &USER_NAME..tb_sample のドットが2つになる箇所です。 これは調査したところによると、「.」が変数名の区切り文字として使われるからと分かりました。

置換変数は単独で使用する場合には &変数名 として使用する。
&変数名xxxyyyy などと文字列が続く場合には 変数名xxxyyyy が変数名として解釈される。
そのため &変数名.xxxyyy のように後続文字列の間にドット(.) を設置することで変数名と文字列を区切りって変数名だけを認識させる。
https://www.shift-the-oracle.com/sqlplus/system-variable/define.html

つまり、1つのドットは変数名と単なる文字列を区切るためのドットで、2つめのドットは単なるドットとなります。

CREATE TABLEにおけるドット

変数を展開すると、テーブル作成は CREATE TABLE hogeuser.tb_sample になります。 ここのhogeuserは、スキーマ名です。

hogeuserスキーマにtb_sampleテーブルを作るとなります。

あとがき

Oracleの扱い方は、MySQLやPostgreSQLとは結構異なるので改めて入門が必要だと感じている次第です。