イデンティファイアの範囲とは、そのイデンティファイアを参照できる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を参照できません。