字句単位

PL/SQLの字句単位(デリミタ、識別子、リテラル、プラグマおよびコメント)は、PL/SQLの最小の個別構成要素です。

ここでのトピック

デリミタ

デリミタは、PL/SQLで特別な意味を持つ文字、または文字の組合せです。

デリミタの中にデリミタ以外の文字(空白文字を含む)を埋め込まないでください。

表3-2に、PL/SQLのデリミタの概要を示します。

表3-2 PL/SQLのデリミタ

デリミタ 意味

+

加算演算子

:=

代入演算子

=>

結合演算子

%

属性のインジケータ

'

文字列のデリミタ

.

構成要素のインジケータ

||

連結演算子

/

除算演算子

**

指数演算子

(

式またはリストのデリミタ(開始)

)

式またはリストのデリミタ(終了)

:

ホスト変数のインジケータ

,

項目のセパレータ

<<

ラベルのデリミタ(開始)

>>

ラベルのデリミタ(終了)

/*

複数行コメントのデリミタ(開始)

*/

複数行コメントのデリミタ(終了)

*

乗算演算子

"

二重引用符で囲んだ識別子のデリミタ

..

範囲演算子

=

関係演算子(等しい)

<>

関係演算子(等しくない)

!=

関係演算子(等しくない)

~=

関係演算子(等しくない)

^=

関係演算子(等しくない)

<

関係演算子(より小さい)

>

関係演算子(より大きい)

<=

関係演算子(以下)

>=

関係演算子(以上)

@

リモート・アクセスのインジケータ

--

単一行コメントのインジケータ

;

文の終了記号

-

減算演算子または否定演算子

識別子

識別子は、次に示すPL/SQL要素に名前を付けます。

  • 定数

  • カーソル

  • 例外

  • キーワード

  • ラベル

  • パッケージ

  • 予約語

  • サブプログラム

  • 変数

英字かどうかに関係なく、識別子に含まれているすべての文字が意味を持ちます。たとえば、識別子lastnamelast_nameは別のものとみなされます。

隣接する識別子は、1つ以上の空白またはデリミタ文字で区切る必要があります。

「ユーザー定義の引用識別子」で説明している例を除き、PL/SQLでは識別子の大/小文字が区別されません。たとえば、識別子lastnameLastNameおよびLASTNAMEは同じものとみなされます。

ここでのトピック

予約語およびキーワード

予約語キーワードは、PL/SQLで特別な意味を持つ識別子です。

通常のユーザー定義の識別子として、予約語を使用することはできません。予約語は、ユーザー定義の引用識別子として使用できますが、使用しないことをお薦めします。詳細は、「ユーザー定義の引用識別子」を参照してください。

キーワードは、通常のユーザー定義の識別子として使用できますが、使用しないことをお薦めします。

PL/SQLの予約語のリストは表D-1、キーワードのリストは表D-2を参照してください。

事前定義の識別子

事前定義の識別子は、事前定義のパッケージSTANDARDで宣言されています。

事前定義の識別子の例としては、例外INVALID_NUMBERがあります。

事前定義の識別子のリストを取得するには、DBAロールを持つユーザーとしてOracle Databaseに接続し、次の問合せを使用します。

SELECT TYPE_NAME FROM ALL_TYPES WHERE PREDEFINED='YES';

事前定義の識別子は、ユーザー定義の識別子として使用できますが、使用しないことをお薦めします。ローカルの宣言はグローバルな宣言をオーバーライドします(「識別子の有効範囲と可視性」を参照)。

ユーザー定義の識別子

ユーザー定義の識別子の特性は次のとおりです。

  • データベース文字セットの文字で構成されます。

  • 通常の識別子と引用識別子があります。

ヒント:

ユーザー定義の識別子は、意味のあるものにします。たとえば、cost_per_thousandは意味が明白ですが、cptは意味があいまいです。

ヒント:

スキーマとスキーマ・オブジェクトの両方に同じユーザー定義識別子を使用しないでください。コードの可読性とメンテナンス性が低下し、コーディングの誤りにつながる可能性があります。ローカル・オブジェクトの名前解決は、スキーマ修飾よりも優先されます。

データベース・オブジェクトのネーミング・ルールの詳細は、『Oracle Database SQL言語リファレンス』を参照してください

PL/SQL固有の名前解決ルールの詳細は、PL/SQLとSQLでの名前解決ルールの相違点を参照してください。

通常のユーザー定義の識別子

通常のユーザー定義の識別子の特性は次のとおりです。

  • 先頭は英字です。

  • 文字、数字および次の記号を使用できます。

    • ドル記号($)

    • シャープ記号(#)

    • アンダースコア(_)

  • 予約語(表D-1を参照)は使用できません。

データベース文字セットには、文字および数字として分類される文字が定義されています。COMPATIBLEが12.2以上の値に設定されている場合、データベース文字セットでの識別子表現は、128バイトを超えないように定義する必要があります。COMPATIBLEが12.1以下の値に設定されている場合、上限は30バイトです。

通常のユーザー定義の識別子として有効な例を次に示します。

X
t2
phone#
credit_limit
LastName
oracle$number
money$$$tree
SN##
try_again_

通常のユーザー定義の識別子として無効な例を次に示します。

mine&yours
debit-amount
on/off
user id
ユーザー定義の引用識別子

ユーザー定義の引用識別子は、二重引用符で囲まれています。

二重引用符の間には、二重引用符、改行文字およびNULL文字以外の任意の文字をデータベース文字セットから使用できます。たとえば、次の識別子を使用できます。

"X+Y"
"last name"
"on/off switch"
"employee(s)"
"*** header info ***"

COMPATIBLEが12.2以上の値に設定されている場合、データベース文字セットでの引用識別子表現は、(二重引用符を除いて)128バイトを超えないように定義する必要があります。COMPATIBLEが12.1以下の値に設定されている場合、上限は30バイトです。

ユーザー定義の引用識別子では大/小文字が区別されますが、例外が1つあります。ユーザー定義の引用識別子から二重引用符を除いたものが有効な通常のユーザー定義の識別子である場合は、その識別子を参照するときの二重引用符は省略可能になり、省略した場合は識別子の大/小文字が区別されなくなります。

お薦めしませんが、予約語をユーザー定義の引用識別子として使用することができます。予約語は有効な通常のユーザー定義の識別子ではないため、識別子は二重引用符で囲む必要があり、大/小文字は常に区別されます。

例3-1 ユーザー定義の引用識別子に対する、大/小文字を区別しない有効な参照

この例では、ユーザー定義の引用識別子"HELLO"は、二重引用符がなくても有効な通常のユーザー定義の識別子です。したがって、Helloという参照は有効です。

DECLARE
  "HELLO" varchar2(10) := 'hello';
BEGIN
  DBMS_Output.Put_Line(Hello);
END;
/

結果:

hello

例3-2 ユーザー定義の引用識別子に対する、大/小文字を区別しない無効な参照

この例では、"Hello"という参照は無効です。これは、二重引用符を付けると識別子の大/小文字が区別されるためです。

DECLARE
  "HELLO" varchar2(10) := 'hello';
BEGIN
  DBMS_Output.Put_Line("Hello");
END;
/

結果:

  DBMS_Output.Put_Line("Hello");
                        *
ERROR at line 4:
ORA-06550: line 4, column 25:
PLS-00201: identifier 'Hello' must be declared
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored

例3-3 ユーザー定義の引用識別子としての予約語

この例では、ユーザー定義の引用識別子"BEGIN""Begin"および"begin"が宣言されています。BEGINBeginおよびbeginは同じ予約語を表しますが、"BEGIN""Begin"および"begin"は異なる識別子を表します。

DECLARE
  "BEGIN" varchar2(15) := 'UPPERCASE';
  "Begin" varchar2(15) := 'Initial Capital';
  "begin" varchar2(15) := 'lowercase';
BEGIN
  DBMS_Output.Put_Line("BEGIN");
  DBMS_Output.Put_Line("Begin");
  DBMS_Output.Put_Line("begin");
END;
/

結果:

UPPERCASE
Initial Capital
lowercase
 
PL/SQL procedure successfully completed.

例3-4 二重引用符の省略

この例では、二重引用符で囲まずに、予約語であるユーザー定義の引用識別子を参照しています。

DECLARE
  "HELLO" varchar2(10) := 'hello';  -- HELLO is not a reserved word
  "BEGIN" varchar2(10) := 'begin';  -- BEGIN is a reserved word
BEGIN
  DBMS_Output.Put_Line(Hello);      -- Double quotation marks are optional
  DBMS_Output.Put_Line(BEGIN);      -- Double quotation marks are required
end;
/

結果:

  DBMS_Output.Put_Line(BEGIN);      -- Double quotation marks are required
                       *
ERROR at line 6:
ORA-06550: line 6, column 24:
PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:
( ) - + case mod new not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
table continue avg count current exists max min prior sql
stddev sum variance execute multiset the both leading
trailing forall merge year month day hour minute second
timezone_hour timezone_minute timezone_region timezone_abbr
time timestamp interval date
<a string literal with character set specificat

例3-5 大/小文字の区別の無視

この例では、大/小文字の区別を無視して、予約語であるユーザー定義の引用識別子を参照しています。

DECLARE
  "HELLO" varchar2(10) := 'hello';  -- HELLO is not a reserved word
  "BEGIN" varchar2(10) := 'begin';  -- BEGIN is a reserved word
BEGIN
  DBMS_Output.Put_Line(Hello);      -- Identifier is case-insensitive
  DBMS_Output.Put_Line("Begin");    -- Identifier is case-sensitive
END;
/

結果:

  DBMS_Output.Put_Line("Begin");    -- Identifier is case-sensitive
                        *
ERROR at line 6:
ORA-06550: line 6, column 25:
PLS-00201: identifier 'Begin' must be declared
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored

リテラル

リテラルは、識別子で表現したり他の値から計算する必要がない値です。

たとえば、123は整数リテラルで'abc'は文字リテラルですが、1+2はリテラルではありません。

PL/SQLリテラルには、BOOLEANリテラルを含むすべてのSQLリテラル(『Oracle Database SQL言語リファレンス』を参照)が含まれます。BOOLEANリテラルとは、事前定義の論理値TRUEFALSEまたはNULLのことです。NULLは、不明な値を表します。

ノート:

『Oracle Database SQL言語リファレンス』と同様に、このマニュアルでも文字リテラルおよび文字列という用語を同じ意味で使用しています。

PL/SQLで文字リテラルを使用する場合は、次のことに注意してください。

  • 文字リテラルは大/小文字が区別されます。

    たとえば、'Z''z'は別のものとみなされます。

  • 空白文字が意味を持ちます。

    たとえば、次のリテラルは別のものとみなされます。

    'abc'
    ' abc'
    'abc '
    ' abc '
    'a b c'
    
  • PL/SQLには、「文字列が次のソース行へ続く」ことを意味する行継続文字がありません。文字列を次のソース行へ続けた場合、文字列に改行文字が含まれます。

    たとえば、次のPL/SQLコードの場合:

    BEGIN
      DBMS_OUTPUT.PUT_LINE('This string breaks
    here.');
    END;
    /
    

    次のように出力されます:

    This string breaks
    here.
    

    文字列が1つのソース行に収まらない場合に改行文字を含まないようにするには、連結演算子(||)を使用して文字列を構築します。

    たとえば、次のPL/SQLコードの場合:

    BEGIN
      DBMS_OUTPUT.PUT_LINE('This string ' ||
                           'contains no line-break character.');
    END;
    /
    

    次のように出力されます:

    This string contains no line-break character.
    

    連結演算子の詳細は、「連結演算子」を参照してください。

  • '0'から'9'は、整数リテラルの0から9と同じではありません。

    ただし、PL/SQLによって整数に変換されるため、算術式内で使用できます。

  • 0(ゼロ)文字の文字リテラルは値NULLを持っており、NULL文字列と呼ばれます。

    ただし、このNULL値はBOOLEAN値のNULLではありません。

  • 通常の文字リテラルは、データベース文字セット内の文字で構成されます。

    データベース文字セットの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

  • 各国語文字リテラルは、各国語文字セット内の文字で構成されます。

    各国語文字セットの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

  • Qまたはqを文字リテラル構文の一部として使用して、代替の引用符メカニズムが使用されることを示すことができます。このメカニズムでは、単に一重引用符ではなく、文字列に対して様々なデリミタを使用できます。

    代替引用符メカニズムの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

    Live SQL:

    Qメカニズムの例は、文字列リテラルの代替引用符メカニズム(''Q'')で表示および実行できます。

プラグマ

プラグマは、コンパイラに対する命令で、コンパイル時に処理されます。

プラグマは予約語PRAGMAで始まり、プラグマの名前がその後に続きます。一部のプラグマには引数があります。プラグマは、宣言または文の前に記述できます。特定のプラグマにその他の制限が適用される場合もあります。プラグマの影響範囲はプラグマによって異なります。プラグマの名前または引数がコンパイラによって認識されない場合、そのプラグマによる影響はありません。

pragma ::=

プラグマの構文およびセマンティクスの詳細は、次を参照してください。

コメント

PL/SQLコンパイラは、コメントを無視します。コメントを付けておくと、他のアプリケーション開発者がソース・テキストを理解しやすくなります。

一般に、コメントは各コード・セグメントの目的や使用方法を説明するために使用します。また、廃止されたコード部分や作成途中のコード部分をコメントに入れて無効化することもできます。

ここでのトピック

単一行コメント

単一行コメントは--で始まり、その行の終わりまで続きます。

注意:

Oracleプリコンパイラ・プログラムが動的に処理するPL/SQLブロックの中に単一行コメントを置かないでください。Oracleプリコンパイラ・プログラムでは行の終わりを示す文字が無視されるため、単一行コメントはブロックの末尾で終了します。

プログラムのテストまたはデバッグ中に、コード内の1行をコメントにすることによって無効にできます。たとえば:

-- DELETE FROM employees WHERE comm_pct IS NULL

例3-6 単一行コメント

この例には、3つの単一行コメントがあります。

DECLARE
  howmany     NUMBER;
  num_tables  NUMBER;
BEGIN
  -- Begin processing
  SELECT COUNT(*) INTO howmany
  FROM USER_OBJECTS
  WHERE OBJECT_TYPE = 'TABLE'; -- Check number of tables
  num_tables := howmany;       -- Compute another value
END;
/

複数行コメント

複数行コメントは、/*で始まって*/で終わり、複数行にまたがることができます。

複数行コメントのデリミタを使用すると、コードの一部分をコメントにできます。その場合、複数行コメントをネストしないように注意してください。複数行コメントに別の複数行コメントを含めることはできません。ただし、複数行コメントに単一行コメントを含めることはできます。たとえば、次の場合、構文エラーが発生します。

/*
  IF 2 + 2 = 4 THEN
    some_condition := TRUE;
  /* We expect this THEN to always be performed */
  END IF;
*/

次の場合、構文エラーは発生しません。

/*
  IF 2 + 2 = 4 THEN
    some_condition := TRUE;
  -- We expect this THEN to always be performed
  END IF;
*/

例3-7 複数行コメント

この例には、2つの複数行コメントがあります。(SQLファンクションTO_CHARは、引数に相当する文字を戻します。TO_CHARの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。)

DECLARE
  some_condition  BOOLEAN;
  pi              NUMBER := 3.1415926;
  radius          NUMBER := 15;
  area            NUMBER;
BEGIN
  /* Perform some simple tests and assignments */
 
  IF 2 + 2 = 4 THEN
    some_condition := TRUE;
  /* We expect this THEN to always be performed */
  END IF;
 
  /* This line computes the area of a circle using pi,
  which is the ratio between the circumference and diameter.
  After the area is computed, the result is displayed. */
 
  area := pi * radius**2;
  DBMS_OUTPUT.PUT_LINE('The area is: ' || TO_CHAR(area));
END;
/
 

結果:

The area is: 706.858335

字句単位の間の空白文字

字句単位の間に空白文字を挿入できます。多くの場合、これによってソース・テキストが読みやすくなります。

例3-8 空白文字によるソース・テキストの読みやすさの向上

DECLARE
  x    NUMBER := 10;
  y    NUMBER := 5;
  max  NUMBER;
BEGIN
  IF x>y THEN max:=x;ELSE max:=y;END IF;  -- correct but hard to read
  
  -- Easier to read:
  
  IF x > y THEN
    max:=x;
  ELSE
    max:=y;
  END IF;
END;
/