識別子のスコープとは、その識別子を参照できるPLユニットの領域を指します。識別子の可視性とは、識別子を限定せずにそれを参照できるPLユニットの領域を指します。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
識別子は、それを宣言したPLユニット内ではローカルです。そのユニットにサブユニットがある場合、識別子はサブユニットに対してグローバルになります。
サブユニットでグローバル識別子が再宣言された場合、2つの識別子はどちらもそのサブユニット内に存在しますが、可視なのはローカル識別子のみです。グローバル識別子を参照するには、サブユニットは宣言ユニット名を使用してそれを限定する必要があります。そのユニットに名前がない場合、サブユニットはグローバル識別子を参照できません。
PLユニットは、他の同じレベルのユニットで宣言された識別子を参照することはできません。なぜなら、これらの識別子はローカルブロックでもグローバルブロックでもないからです。
同一のPLユニット内で同一の識別子を2回宣言することはできません。そうすると、重複する識別子を参照する際にエラーが発生します。
異なる2つのユニットで同一の識別子を宣言することは可能ですが、識別子が表す2つのオブジェクトは異なり、一方を変更してももう一方には影響しません。
同一のスコープ内で、ラベルやサブプログラムに一意の名前を付けることで、混乱や異常な動作を回避できます。
-- 外部ブロック
obclient> DECLARE
x CHAR; -- x (CHAR) スコープ開始
y FLOAT; -- y スコープ開始
BEGIN
-- x (CHAR)と y は可視です
-- 最初のサブブロック:
DECLARE
x INTEGER; -- x (INTEGER) スコープ開始
z FLOAT; -- z スコープ開始
BEGIN
-- x (INTEGER)、y、z は可視です
NULL;
END; -- x (INTEGER) と z のスコープ終了
-- 2番目のサブブロック:
DECLARE
w FLOAT; -- w スコープ開始
BEGIN
-- x (CHAR)、 y と w は可視です
NULL;
END; -- w スコープ終了
-- x (CHAR)と y は可視です
END; -- x (CHAR) と y のスコープ終了
/
Query OK, 0 rows affected
この例は、複数の識別子のスコープと可視性を示しています。最初のサブブロックではグローバル識別子 x が再宣言されています。グローバル変数 y を参照するには、最初のサブブロックは外部ブロックの名前を使用してそれを限定する必要がありますが、外部ブロックには名前がありません。したがって、最初のサブブロックはグローバル変数 x を参照できず、ローカル変数 x のみを参照できます。サブブロックは同じレベルにあるため、最初のサブブロックは w を参照できず、2番目のサブブロックは z を参照できません。