3.2 SQLモジュール言語の構文
SQLモジュール言語では、SQLプリコンパイラによってサポートされていないホスト言語からSQL文を含むプロシージャをコールできるようにする、特別なキーワードおよび構文が提供されています。
SQLモジュール言語要素は、SQLモジュール・ファイルの一部である必要があります。
ALIAS alias-name
モジュールのデフォルトの別名を指定します。モジュールの別名を指定しない場合、デフォルトの別名はモジュールの認可識別子です。FIPSフラガーが有効である場合、ALIAS句(単独で、またはAUTHORIZATION句とともに使用)は非標準構文としてフラグが付けられます。
アプリケーションが複数のモジュール間で参照する必要があるデータベースが1つのみの場合は、実行可能イメージを構成するためにリンクされるすべてのモジュールで、デフォルト・データベースに同じ別名を使用すると便利です。SQLプリコンパイラで処理されるモジュールがそのイメージに含まれる場合は、そのイメージのすべてのSQLモジュールのAUTHORIZATION句でRDB$DBHANDLEを指定する必要があります。これは、別名RDB$DBHANDLEでは、プリコンパイルされたSQLプログラムでデフォルト・データベースが常に指定されるためです。
AUTHORIZATION auth-id
モジュールの認可識別子を指定します。スキーマの認可識別子を指定しない場合、認可識別子はモジュールをコンパイルしているユーザーのユーザー名です。ANSI/ISO SQL89規格に準拠する場合は、スキーマ名なしでAUTHORIZATION句を指定します。ANSI/ISO SQL99規格に準拠する場合は、AUTHORIZATION句とスキーマ名を指定します。
マルチスキーマ・データベースにアタッチする場合、各スキーマの認可識別子はモジュールをコンパイルしているユーザーのユーザー名です。この認可識別子はデフォルトの別名およびスキーマを定義します。ALIAS句とSCHEMA句を使用してデフォルトをオーバーライドできます。
単一スキーマ・データベースにアタッチするか、またはATTACH文またはDECLARE ALIAS文にMULTISCHEMA IS OFFを指定してAUTHORIZATION句とALIAS句の両方を指定した場合、モジュール・ファイル内でRIGHTS句を指定する場合を除き認可識別子はSQLによって無視されます。RIGHTS句によって、SQLでは権限チェックのモジュールAUTHORIZATION句に指定された認可識別子が使用されるようになります。この項の後半で説明するRIGHTS句を参照してください。
SQLモジュールのプロシージャが常に認可識別子で表名を修飾する場合、AUTHORIZATION句はプロシージャのSQL文には影響しません。
FIPSフラガーが有効である場合、AUTHORIZATION句の省略は非標準構文としてフラグが付けられます。
BY DESCRIPTOR
仮パラメータが、記述子によってコール側プログラム・モジュールに渡されることを指定します。BY DESCRIPTOR句は次の場合に便利です。
- SQLモジュールのLANGUAGE句でGENERALキーワードを指定するが、言語のデフォルトではパラメータは記述子によって渡される場合。GENERALのデフォルトでは、パラメータは参照によって渡されます。ただし、BY DESCRIPTORを指定することによって、デフォルトの受渡しメカニズムをオーバーライドできます。
- パラメータ宣言にCHECKオプションを利用する場合。このオプションは、BY DESCRIPTOR句で宣言されたパラメータに対してのみ使用できます。
- 参照によってパラメータを渡す言語のデフォルトのパラメータ受渡しメカニズムをオーバーライドする必要がある場合。
BY DESCRIPTOR句では、固定長フィールドであるOpenVMS静的記述子のみがサポートされています。
どの言語でも、SQLモジュール仮パラメータの受渡しメカニズムは、ホスト言語モジュールの実パラメータと同じである必要があります。
Ada、BASIC、C、FORTRAN、PascalおよびPL/Iでは、記述子によるレコードの受渡しはサポートされません。これらすべての言語の要素から記述子を構成して、構成した記述子を参照によってSQLモジュール言語に渡すことができます。
- モジュール言語がAda、BASIC、C、FORTRAN、Pascal、PL/IまたはGENERALであるときにホスト言語レコードの記述子を構成する場合は、文字列データ型で固定長記述子(CLASS_S)を使用して、レコード全体の長さを渡します。
- 言語がAda、BASIC、FORTRANまたはPascalの場合は、配列記述子(CLASS_A)およびすべての配列要素のデータ型を使用して、インジケータ配列を渡します。
- 言語がCOBOLの場合は、配列要素のデータ型に関係なく、固定長(CLASS_S)記述子および文字列データ型を使用して配列を渡します。
- 言語がCの場合、SQLモジュール・プロセッサでCHARフィールドが解釈される方法は、データ型がモジュールで定義されているか、または定義がディクショナリから読み込まれるかによって異なります。データ型がモジュールで定義されている場合、SQLモジュール・プロセッサでは、レコード内の文字列がヌル文字で終了する文字列として解釈されます。つまり、CHAR(9)として指定されているフィールドを宣言する場合、Cモジュール言語では、このフィールドは10番目の文字がヌル終端文字である10文字の長さのフィールドとして解釈されます。
CATALOG catalog-name
モジュールのデフォルト・カタログを指定します。カタログとは、マルチスキーマ・データベース内のスキーマのグループのことです。マルチスキーマ・データベースでオブジェクトを指定する場合にカタログ名を省略すると、デフォルトのカタログ名RDB$CATALOGが使用されます。マルチスキーマ属性なしで作成されたデータベースにはカタログがありません。SET CATALOG文を使用すると、動的または対話型SQLの現在のデフォルトのカタログ名を変更できます。CHARACTER LENGTH
文字列パラメータ、列およびドメインの長さを文字またはオクテットのどちらで解釈するかを指定します。言語がSQL89、SQL92、SQL99またはMIAに設定されている場合、デフォルトはCHARACTERSです。それ以外の場合、デフォルトはOCTETSです。char-data-types
SQLでサポートされている文字データ型の詳細は、第2.3節を参照してください。CHECK
実パラメータのデータ型、長さおよび記述子のスケールと、SQLモジュールのプロシージャ・パラメータに宣言された値を実行時に比較するように指定します。2つの値が一致しない場合は、エラーが返されます。CHECK句は、コール側ホスト言語モジュールから記述子によって渡されるパラメータでのみ使用できます。コンパイル時にSQLモジュールとコール側ホスト言語プログラム・モジュールの間に接続が存在しないため、仮パラメータ宣言とモジュールに対するコールの実パラメータの間の一致を検証する方法はありません。CHECK句では、プログラムの実行時にこのような検証を実行できます。
仮パラメータ宣言でCHECK句を指定しない場合は、プロシージャとコール側パラメータが一致するとみなされます。一致していない場合は、予期しない結果が生じる可能性があります。ただし、次の場合は、CHECK句を使用しないことを選択できます。
- CHECK句がANSI規格SQLに組み込まれていない場合。
- 実行時にパラメータをチェックするときにパフォーマンスへのわずかな影響がある場合。
- CHECKの使用によりホスト・プログラムがより複雑になる場合。
CHECK句では、仮パラメータとコール・パラメータを比較するときに次のルールに従います。
- 仮パラメータがTIMESTAMPデータ型の場合、CHECK句では対応する8バイト長の実パラメータが受け入れられます。
- 言語がC、仮パラメータがCHARデータ型の場合、CHECK句では、記述子は仮パラメータの文字数よりも1バイト長くなると想定されます。これは、Cの文字列には仮パラメータ宣言の長さには含まれない終了文字(ASCIZ形式)が含まれるためです。
- CHECK句では、CHARACTERデータ型で宣言されるプロシージャ・パラメータに対してBASICの動的文字記述子(CLASS_D)がサポートされています。ただし、データを受け取るバッファは実行時に割り当てられるため、CHECK句では記述子の長さとプロシージャ・パラメータの長さは比較されません。
- 仮パラメータがVARCHARデータ型の場合、CHECK句で受け入れられる記述子は言語に依存します。
- 言語がPL/IまたはPascal(可変文字データ型をサポートする言語)の場合、記述子は可変文字列(CLASS_VS)記述子、データ型は可変テキスト、および長さは仮パラメータ宣言の長さと同じである必要があります。
- 言語がPL/IまたはPascalのいずれでもない場合、CHECK句では、前述のパラグラフにあるような可変文字列記述子、またはデータ型がテキストで仮パラメータ宣言の長さよりも2バイト長い固定長(CLASS_S)記述子または不特定(DTYPE_Z)記述子が受け入れられます。
異なる種類のOpenVMS引数記述子の詳細は、OpenVMSのプログラミング・ドキュメントを参照してください。
compound-statement
通常、複数の実行SQL文、関連する変数宣言、およびBEGIN...ENDブロック内の制御文を含みます。ただし、これらの引数はオプションです。たとえば、空のBEGIN...ENDブロック(BEGIN END;)を作成できます。複合文が埋め込まれているプロシージャがホスト言語モジュールでコールされると、複合文が実行されます。複合文の詳細は、「複合文」を参照してください。
COMPOUND TRANSACTIONS INTERNAL
COMPOUND TRANSACTIONS EXTERNAL
複合文またはストアド・プロシージャを実行する前にトランザクションを開始するかどうかを指定できます。COMPOUND TRANSACTIONS EXTERNAL句は、プロシージャを実行する前にトランザクションを開始するように指示します。COMPOUND TRANSACTIONS INTERNAL句は、プロシージャの実行による要求に応じて、プロシージャでトランザクションを開始するように指示します。
デフォルトでは、現在のトランザクションが存在しない場合、複合文を実行する前にトランザクションが開始されます。
data-type
文字データ型として定義されているパラメータのキャラクタ・セットを指定できます。次のルールに基づいてパラメータのキャラクタ・セットが想定されます。
- パラメータがキャラクタ・セットによって修飾されていないか、または各国語キャラクタ・データ型として定義されていない場合、パラメータは、DEFAULT CHARACTER SET句で指定されているデフォルト・キャラクタ・セットとみなされます。
- パラメータが各国語キャラクタ・データ型(NCHAR、NCHAR VARYING)として定義されている場合、パラメータは、NATIONAL CHARACTER SET句で指定されている各国語キャラクタ・セットとみなされます。
- パラメータがキャラクタ・セットで修飾されているデータ型として定義されている場合、パラメータはそのキャラクタ・セットとみなされます。
INTEGERデータ型を除き、データ型およびキャラクタ・セットでのデータ型の修飾の詳細は、第2.3節および第3.5節を参照してください。次の引数では、SQLモジュール言語に関するINTEGERデータ型について記述します。
モジュールの仮パラメータに指定されるSQLデータ型は、実パラメータのホスト言語変数宣言のデータ型に相当する必要があります。仮パラメータと実パラメータが同じデータ型で宣言されていない場合は、予期しない結果が生じる可能性があります。第3.5節では、SQLデータ型に相当するホスト言語データ型を示し、同義のホスト言語データ型が存在しない場合にモジュール・プロシージャでデータ型を変換する方法について説明します。
データベース・キーのデータ型はCHAR(n)です。ここで、nはデータベース・キーのバイト数に相当します。データベース・キーの詳細は、第2.6.5項を参照してください。
date-time-data-types
frac
interval-qualifier
prec
seconds-prec
特定のデータ型およびその修飾子の詳細は、第2.3節を参照してください。declare-statement
次の文のいずれかです。
- DECLARE ALIAS
- DECLARE CURSOR
- DECLARE STATEMENT
- DECLARE TABLE
- DECLARE TRANSACTION
SQLモジュールでは、モジュールのLANGUAGE句の後にすべてのDECLARE文をまとめて配置する必要があります。前述のすべてのDECLARE文はオプションです。
DECLARE TRANSACTIONを除くすべてのDECLARE文は繰り返すことができます。ただし、DECLARE CURSOR文ごとに、DECLARE CURSOR文に対応するOPEN文を含むプロシージャが1つのみSQLモジュールに存在している必要があります。
DECLARE文またはプロシージャ・セクションと宣言文セクションを区切るために記号は使用しないでください。
DEFAULT CHARACTER SET support-char-set
キャラクタ・セットによって修飾されず、各国語キャラクタ・データ型として定義されないパラメータのキャラクタ・セットを指定します。この句またはNAMES ARE句でキャラクタ・セットを指定しない場合、デフォルトはDEC_MCSです。この句は、NAMES ARE句で指定されたキャラクタ・セットをオーバーライドします。使用可能なキャラクタ・セットのリストは、第2.1節を参照してください。DEFAULT DATE FORMAT
DATEデータ型またはCURRENT_TIMESTAMPデータ型を持つ列のデフォルトの解釈を制御します。DATEデータ型およびCURRENT_TIMESTAMPデータ型は、VMSまたはSQLのどちらの形式でもかまいません。VMSを指定した場合、両方のデータ型がVMS形式として解釈されます。VMS形式のDATEおよびCURRENT_TIMESTAMPには、TIMESTAMPのようにYEAR TO SECONDフィールドが含まれます。
SQL99などのSQL規格を指定した場合、両方のデータ型がSQL形式として解釈されます。SQL形式のDATEには、YEAR TO DAYフィールドのみが含まれます。
デフォルトはVMSです。
ANSI_DATE修飾子は将来のリリースで廃止予定のため、DEFAULT DATE FORMAT句を使用してください。
DIALECT
現在の接続に対して次の設定を制御します。
- 文字列パラメータ、列およびドメインの長さを文字とオクテットのどちらで解釈するか
- 二重引用符を文字列リテラルとデリミタ付き識別子のどちらで解釈するか
- 識別子をキーワードにできるかどうか
- どのビューが読取り専用か
- DATEデータ型またはCURRENT_TIMESTAMPデータ型を持つ列をVMSとSQL99のどちらの形式で解釈するか
- パラメータ名をコロンで開始するかどうか
- 指定された言語に応じてセッション・キャラクタ・セットを変更するかどうか
DIALECT句によって、各設定を個々に指定するのではなく1つの句で設定を指定できます。モジュール・プロセッサはモジュール句を順番に処理するため、DIALECT句ではその前に指定された句(QUOTING RULESなど)の設定をオーバーライドすることも、その後に指定される句でオーバーライドされることも可能です。
次の説明はSQL92言語およびSQL99言語固有です。
- デフォルトの制約の評価時間の設定が、DEFERRABLEからNOT DEFERRABLEに変更されています。
- データの格納時またはデータの取得時に文字のデータ型が変換される場合、特定の状況下では例外または警告が発生します。
- SQLモジュール内の仮パラメータにはDECIMALまたはNUMERICを指定できます。また、ホスト言語パラメータをパック10進数または符号付き数値の記憶域形式で宣言できます。指定された精度を超える処理を実行しようとすると、エラー・メッセージが生成されます。
- USERキーワードにより、リクエストに対して現在アクティブなユーザー名を指定します。
- SETファンクションからNULL値が削除されると、警告が生成されます。
- ビューに対してWITH CHECK OPTION句を使用すると、整合性制約障害のために個別エラー・コードが返されます。
- C文字列がNULLで終了していない場合、例外が生成されます。
DIALECT句の各オプションの設定の詳細は、「SET DIALECT文」を参照してください。
DISPLAY CHARACTER SET names-char-set
アプリケーションとSQL間の自動変換に使用されるキャラクタ・セットを指定します。キャラクタ・セットを指定しない場合、デフォルト名はDEC_MCSです。使用可能なキャラクタ・セットのリストは、第2.1.5項を参照してください。domain-name
直接SQLデータ型を指定したり、ドメインに名前を付けることができます。ドメインに名前を付ける場合、パラメータではドメインのデータ型が継承されます。FIXED
FIXED句、NULL TERMINATED BYTES句およびNULL TERMINATED CHARACTERS句では、C言語のテキスト・フィールドを解釈する方法がモジュール・プロセッサに通知されます。「使用方法」の例3は、宣言するテキスト・フィールドのサイズが、選択する3つの解釈オプションに応じてどのように異なるかを示しています。FIXEDを指定すると、モジュール・プロセッサは、ディクショナリのCHARフィールドを固定長文字列と解釈します。
INDICATOR ARRAY OF
exact-numeric-type図に示されるデータ型のいずれかを使用して要素の1次元配列を指定します。インジケータ配列は、ホスト構造体のフィールドに対するインジケータ・パラメータの集まりです。インジケータ配列には、少なくともレコード定義と同じ数の要素が含まれている必要があります。インジケータ配列をレコードとして使用したり、レコード内に含めることはできません。つまり、INDICATOR ARRAY OF句は第2レベルのレコード指定(レコード型内で指定するレコード型)で使用できません。
インジケータ配列では個別要素を明示的に参照できません。このため、インジケータ配列はUPDATE文またはWHERE句では使用できません。
インジケータ配列の詳細は、第2.2.13.2項を参照してください。
item-name
レコード内の項目の名前を指定します。同じレコード宣言の同じレベルで、2つのレコード項目に同じ名前を指定しないでください。プロシージャ内のSQL文が、パラメータ宣言と同じプロシージャのサブレコード内にある項目名を参照する場合は、レコード名および介在するすべてのサブレコード名を使用して項目名を完全に修飾する必要があります。レコード名と項目名はピリオドを使用して区切ります。
KEYWORD RULES
識別子をキーワードにできるかどうかを制御します。SQL92、SQL99、SQL89またはMIAを指定した場合、二重引用符で囲む場合を除き、キーワードを識別子として使用できません。SQLV40を指定した場合は、キーワードを識別子として使用できます。デフォルトはSQLV40です。ANSI_IDENTIFIER修飾子は将来のリリースで廃止予定のため、KEYWORD RULES句を使用してください。
LANGUAGE language-name
プログラムが記述されるホスト言語の名前を指定するキーワードです。このプログラムでは、モジュール内でプロシージャがコールされます。LANGUAGE句に対応するキーワードを持たない言語にGENERALを指定します。言語識別子により次が決まります。
- SQLモジュール・プロセッサで、モジュールの仮パラメータ宣言において有効とみなされるデータ型の種類。一部のSQLデータ型に相当するデータ型が言語でサポートされていない場合、SQLモジュール・プロセッサでは、仮パラメータでそのデータ型が検出されたときに警告メッセージが生成されます。 (仮パラメータは、SQLモジュール・プロシージャに対するホスト言語コールで対応する実パラメータを表すSQLモジュール・プロシージャ宣言での名前です。)
たとえば、SQLではBIGINTデータ型はサポートされますが、PL/Iではサポートされません。モジュール・プロセッサでは、LANGUAGEセクションでPL/I言語を指定するSQLモジュールでBIGINT仮パラメータが検出されると、警告メッセージが生成されます。- ホスト言語ソース・ファイル間でパラメータを受け渡すデフォルトのメカニズム。パラメータは、LANGUAGE句で指定されている言語のデフォルトの受渡しメカニズムによって常に受け渡されます。表3-1は、これらのデフォルトを示しています。
表3-1 SQLモジュールのホスト言語のデフォルト受渡しメカニズム 言語 受渡しメカニズム Ada 参照 BASIC CHARは記述子、その他はすべて参照 C 参照 COBOL 参照 FORTRAN CHAR、SQLCA、SQLDAは記述子、その他はすべて参照 Pascal 参照 PL/I 参照 GENERAL 参照
- 特定の実パラメータに対して想定されるデフォルトのデータ型。
たとえば、COBOLでは、DOUBLE PRECISION仮パラメータがSQLモジュール・プロシージャで宣言されている場合、COBOLではG_FLOATがサポートされていないため、パラメータはG_FLOATではなくD_FLOATとしてコール側モジュールから受け渡されると想定されます。同様に、Cでは、CHAR(n)仮パラメータがSQLモジュール・プロシージャで宣言されている場合、パラメータは(n+1)の長さのASCIZ文字列としてコール側モジュールから受け渡されると想定されます。
LITERAL CHARACTER SET support-char-set
キャラクタ・セットまたは各国語キャラクタ・セットによって修飾されないリテラルのキャラクタ・セットを指定します。この句またはNAMES ARE句でキャラクタ・セットを指定しない場合、デフォルトはDEC_MCSです。この句は、NAMES ARE句で指定された修飾されていないリテラルのキャラクタ・セットをオーバーライドします。使用可能なキャラクタ・セットのリストは、第2.1節を参照してください。MODULE module-name
モジュールのオプション名です。モジュール名を指定しない場合、デフォルト名はSQL_MODULEです。有効なオペレーティング・システム名を使用します。(ユーザー指定の名前の詳細は、第2.2節を参照してください。)ただし、名前は、実行可能イメージを構成するため一緒にリンクされたモジュール間で一意である必要があります。
NAMES ARE names-char-set
モジュールのデフォルト・キャラクタ・セット、識別子キャラクタ・セットおよびリテラル・キャラクタ・セットに使用されるキャラクタ・セットを指定します。この句では、キャラクタ・セットまたは各国語キャラクタ・セットによって修飾されない文字列パラメータも指定します。キャラクタ・セットを指定しない場合、デフォルトはDEC_MCSです。この句で指定したキャラクタ・セットには、ASCIIが含まれている必要があります。使用可能なキャラクタ・セットのリストは、第2.1.5項を参照してください。
NATIONAL CHARACTER SET support-char-set
各国語キャラクタ・セットによって修飾されるリテラルのキャラクタ・セット、および各国語キャラクタ・データ型(NCHAR、NCHAR VARYING)として定義されるパラメータのキャラクタ・セットを指定します。この句でキャラクタ・セットを指定しない場合、デフォルトはDEC_MCSです。使用可能なキャラクタ・セットのリストは、第2.1節を参照してください。PROCEDURE procedure-name
プロシージャの名前を指定します。有効なOpenVMS名を使用します。(ユーザー指定の名前の詳細は、第2.2節を参照してください。)プロシージャ名は、特定のプロシージャを指定するためにホスト言語コールで使用されます。SQLモジュールのプロシージャには、プロシージャ名以外に、1つ以上のパラメータ宣言およびSQL文が含まれている必要があります。
QUIET COMMIT ON
QUIET COMMIT OFF
QUIET COMMIT ON句を使用すると、アクティブなトランザクションがないときにCOMMIT文とROLLBACK文のいずれかが実行された場合、これらの文のエラー・レポートが無効になります。QUIET COMMIT OFF句を使用すると、アクティブなトランザクションがないときにCOMMIT文とROLLBACK文のいずれかが実行された場合、これらの文のエラー・レポートが有効になります。
MODULE TXN_CONTROL LANGUAGE BASIC PARAMETER COLONS QUIET COMMIT ON PROCEDURE S_TXN (SQLCODE); SET TRANSACTION READ WRITE; PROCEDURE C_TXN (SQLCODE); COMMIT;
デフォルトはQUIET COMMIT OFF句です。
QUOTING RULES
二重引用符を文字列リテラルまたはデリミタ付き識別子のどちらで解釈するかを制御します。SQL99、SQL92、SQL89またはMIAを指定した場合は、SQLでは二重引用符をデリミタ付き識別子として解釈します。SQLV40を指定した場合は、SQLでは二重引用符をリテラルとして解釈します。デフォルトはSQLV40です。ANSI_QUOTING修飾子は将来のリリースで廃止予定のため、QUOTING RULES句を使用してください。
RECORD ... END RECORD
モジュール言語パラメータ宣言で指定するレコードの開始位置と終了位置を指定します。レコード定義に、SQLDA、SQLDA2、SQLCODE、SQLCAまたはSQLSTATEを含めることはできません。
record-type
record-type句を使用すると、SQLモジュール言語プロシージャにレコードおよびインジケータ配列を渡すことができます。レコード参照にインジケータがある場合は、インジケータ配列になります。項目名またはパス名のかわりにINDICATOR ARRAY OF句を指定します。
次の例は、SQLモジュール言語プログラムのレコード構造およびインジケータ配列の使用方法を示しています。モジュールのパラメータの先頭にはコロンが付くため、モジュール・ヘッダーにPARAMETER COLONS句を含める必要があります。
MODULE employee_module LANGUAGE pascal AUTHORIZATION pers PARAMETER COLONS DECLARE pers ALIAS FOR FILENAME mf_personnel DECLARE WORK_STATUS_CURSOR CURSOR FOR SELECT * FROM PERS.WORK_STATUS PROCEDURE OPEN_WORK_STATUS SQLCODE; OPEN WORK_STATUS_CURSOR; PROCEDURE CLOSE_WORK_STATUS SQLCODE; CLOSE WORK_STATUS_CURSOR; PROCEDURE FETCH_EMPS_TO_DEPS_CURSOR SQLCODE, :work_status_rec record status_code PERS.work_status.STATUS_CODE_DOM status_name PERS.work_status.STATUS_NAME_DOM status_type PERS.work_status.STATUS_DESC_DOM end record :ind_array record indicator array of 3 SMALLINT end record ; FETCH WORK_STATUS_CURSOR INTO :work_status_rec INDICATOR :ind_array;
RIGHTS
その認可識別子がモジュールの認可識別子に一致するユーザーが、モジュールを実行するかどうかを指定します。