第7章 WebScript言語
7.6 SYSTEM パッケージ変数
変数名に関する規約については、“6.1.2 命名規約”を参照してください。
7.3.2 パッケージ
グローバル変数およびシステム変数は、どれか1つの「パッケージ」に属します。同じ名前をもつ変数でも、属するパッケー ジが異なれば、それらは異なる変数として取り扱われます。
パッケージに属する変数の指定
パッケージ(package)に属する変数varを指定するには、「::」を用いて「package::var」と表記します。
指定した名前のパッケージが存在しない場合は、エラーになります。
パッケージ名に関する規約については、“6.1.2 命名規約”を参照してください。
変数の特定方法
パッケージによって修飾されない変数名varが指定された場合、どの変数が参照されるかのルールについて、以下に示 します。
・ ローカル変数varが存在する場合は、ローカル変数が参照されます。
・ カレントパッケージに属する変数varが存在する場合は、その変数が参照されます。
・ どちらも存在しない場合は、新しいローカル変数varが作成され、その変数が参照されます。
カレントパッケージ
任意の時点で、「カレントパッケージ」と呼ばれるパッケージが定まっています。パッケージ名を指定しないでグローバル 変数を指定した場合は、カレントパッケージに属する変数が参照されます。
フォーマットファイルの解釈がスタートするときのカレントパッケージは、「""(空文字)」です。カレントパッケージは、<!
PACKAGE>タグによって変更することができます。
パッケージ参照の例
以下のex1.html、ex2.html、ex3.htmlおよびex4.htmlはフォーマットファイルです。
【ex1.html】
<HEAD>
<TITLE>Package Example 1</TITLE>
<!PACKAGE "mypkg">
</HEAD>
<BODY>
<!VAR abc SCOPE="GLOBAL" VALUE="global-abc">
:
<!HREPLACE 'abc'> → 表示は「global-abc」です。
:
【ex2.html】(同じパッケージからの呼び出し)
<HEAD>
<TITLE>Package Example 2</TITLE>
<!PACKAGE "mypkg">
</HEAD>
<BODY>
<!HREPLACE 'abc'> → まずローカル変数abcを参照しようとしますが定義されて いないので、ex1.htmlで宣言されたグローバル変数abcが 採用されます。
表示は「global-abc」です。
:
(ローカル変数abcの値を宣言する)
<!VAR abc VALUE="local-abc" SCOPE="LOCAL">
ローカル変数abcは、ex1.htmlで宣言したグローバル変数abcとは違うものになります。
:
<!HREPLACE 'abc'> → パッケージ名による修飾がないので、ローカル変数abcを 参照します。表示は「local-abc」です。
ex1.htmlで宣言したグローバル変数を参照したい場合は、パッケージ名で修飾します。
<!HREPLACE 'mypkg::abc'> → これはグローバル変数のabcなので、表示は「global-abc」
となります。
:
【ex3.html】(別パッケージからの呼び出し)
<HEAD>
<TITLE>Package Example 3</TITLE>
<!PACKAGE "anotherpkg">
(ex1.htmlとは別のパッケージを宣言)
</HEAD>
<BODY>
<!VAR abc VALUE="another-abc" SCOPE="GLOBAL">
<!HREPLACE 'abc'> → このフォーマットファイルのローカル変数abcを参照しよう としますがローカル変数abcは宣言されていないので、カ レントパッケージのグローバル変数abcを参照します。
表示は「another-abc」です。
カレントパッケージ以外のグローバル変数を参照する方法は以下のとおりです。
<!HREPLACE 'mypkg::abc'> → これはmypkgパッケージのグローバル変数abcを指します。
表示は「global-abc」です。
:
【ex4.html】(パッケージ指定のない場合)
<HEAD>
<BODY>
<!VAR abc VALUE="global-non-abc" SCOPE="GLOBAL">
<!VAR abc VALUE="local-non-abc" SCOPE="LOCAL">
<!HREPLACE 'abc'> → ローカル変数abcを指します。
表示は「local-non-abc」です。
グローバル変数abcを指すためには、パッケージで修飾しなければ なりませんが、パッケージ名が宣言されていないので、デフォルトの パッケージである空文字列で修飾します。
<!HREPLACE '::abc'> → グローバル変数abcを参照します。
表示は「global-non-abc」です。
7.4 QUERY パッケージ変数
Webクライアントから送られてくる変数です。
GET methodの場合にURLの一部として指定されるか、またはPOST methodの場合にヘッダのあとに送信されるもので す。
値の有効範囲はローカルです。次のフォーマットファイルを処理するときに、同じ変数が存在することは、一般には保証 されません。また、変数が存在している場合でも、値が同じであることは、一般には保証されません。
Webクライアントから、key=value が送信されると、変数QUERY::keyの値がvalueになります。同一のkeyに対して、複数の valueが指定された場合には、QUERY::keyがリストになります。ただし、その場合の順序は保証されません。また、フォー マットファイル内で、値を設定することはできません。
SolarisおよびLinuxの場合の例を以下に示します。Windows(R)の場合は、例の一部を以下のように変更してください。
・ wit_fmtr → wit_fmtr.exe 例1
<A HREF="/cgi-bin/wit_fmtr?WIT_html=fmt1.html&myVar0=value0">
これによって呼び出されたフォーマットファイル fmt1.htmlの中では、
変数QUERY::myVar0に、値"value0"が設定されます。
例2
<FORM ACTION="/cgi-bin/wit_fmtr" METHOD="POST">
<INPUT TYPE="hidden" NAME="WIT_html" VALUE="fmt2.html">
<INPUT TYPE="checkbox" NAME="cb" VALUE="item1">item1<BR>
<INPUT TYPE="checkbox" NAME="cb" VALUE="item2">item2<BR>
<INPUT TYPE="submit" VALUE="OK">
</FORM>
これによって呼び出されたフォーマットファイル fmt2.htmlの中では、
変数QUERY::cbに設定される値は、ユーザがチェックボックスをどのように チェックしたかによって、以下となります。
- 何もチェックしなかった場合は、「未定義値」
- item1だけをチェックした場合は、「単値"item1"」
- item1、item2をチェックした場合は、「リスト("item1","item2")」
7.5 COOKIE パッケージ変数
Webクライアントから送られてきたcookieの値です。
たとえばnameという名前をもつcookieの値は、変数COOKIE::nameに設定されます。
値の有効範囲はローカルです。次のフォーマットファイルを処理するときに、同じ変数が存在することは、一般には保証 されません。また、変数が存在している場合でも、値が同じであることは、一般には保証されません。
同一の名前nameに対して、複数の値をWebScriptセションが受け取った場合は、COOKIE::nameがリストになります。た だし、その場合の順序は保証されません。また、フォーマットファイル内で値を設定することはできません。
なお、Webクライアント側にcookieを送信する場合は、<!SETCOOKIE>タグを使用してください。
7.6 SYSTEM パッケージ変数
QUERYおよびCOOKIE以外に、WebScriptが用意する変数が属するパッケージです。システムパッケージに変数を作る
ことはできません。
値の有効範囲はローカルです。次のフォーマットファイルを処理するときに、同じ変数が存在することは、一般には保証 されません。また、変数が存在している場合でも、値が同じであることは、一般には保証されません。
SYSTEM::DB_ERRORCODE
データベースエラーコードを参照する変数です。
<!DO>タグによるSQL文の実行、<!ABORT>タグまたは<!TRANSACTION>タグによるトランザクション処理を実行した 場合に、エラーが発生したかどうかを識別する変数です。
フォーマットファイル内で値を設定することはできません。
参照
エラーコードとして、SQLSTATE値を指定します。SQLSTATE値については、“SQLリファレンス”の“SQLSTATE値”を参 照してください。
エラーコードの値を識別する場合は、その値を文字列として扱ってください。
アプリケーション環境パラメタのDBErrorHandleで、データベースのエラー処理を行うことを指定していない場合は、<!
ERRORHANDLE>拡張タグで、データベースタイプにONを指定して、エラー処理を行うことを指定する必要があります。
例 SQLSTATE値が"3F000"の場合
<!ERRORHANDLE ON TYPE=DB>
<!DO "SELECT NAME FROM SCM.SAMPLE" RESULT=DATA>
<!IF 'SYSTEM::DB_ERRORCODE ne "00000"'>
<!IF 'SYSTEM::DB_ERRORCODE eq "3F000"'>
: <!/IF>
:
<!/IF>
<!ERRORHANDLE DEFAULT TYPE=DB>
SYSTEM::DB_ERRORMSG
データベースエラーメッセージを参照する変数です。
<!DO>タグによるSQL文の実行、<!ABORT>タグまたは<!TRANSACTION>タグによるトランザクション処理を実行した
場合に、エラーの内容を通知するエラーメッセージが設定されます。
フォーマットファイル内で値を設定することはできません。
例 SELECT文でのエラー原因メッセージの出力
<!DO "SELECT NAME FROM SCM.SAMPLE" RESULT=DATA>
<!IF 'SYSTEM::DB_ERRORCODE ne "00000"'>
<!HREPLACE SYSTEM::DB_ERRORMSG>
<!ABORT>
<!/IF>
SYSTEM::LAST_DB_ERRORCODE データベースエラーコードを参照する変数です。
Symfoware Serverのログインから現在までの、最後に出力されるSQLのエラーコードの値です。ログイン直後の値
本変数の値は、変更できます。
使用例については、“SYSTEM::LAST_DB_ERRORMSG”を参照してください。
SYSTEM::LAST_DB_ERRORMSG
データベースエラーメッセージを参照する変数です。
Symfoware Serverのログインから現在までの、最後に出力されるSQLのエラーメッセージの値です。ログイン直後の値
は、""(空文字列)です。ただし、wit_gwdコマンドで、WIT_error=yesが指定され、ログインでエラーが発生した場合は、
ログインエラーのエラーメッセージが設定されます。
本変数の値は、変更できます。
例
<!ERRORHANDLE ON>
<!SETVAR SYSTEM::LAST_DB_ERRORCODE "normal">
<!DO "INSERT ~">
<!DO "INSERT ~">
<!DO "INSERT ~">
<!IF 'SYSTEM::LAST_DB_ERRORCODE ne "normal"'>
エラーが発生しました。<!REPLACE SYSTEM::LAST_DB_ERRORMSG><BR>
<!/IF>
SYSTEM::WL_ERRORCODE
WebScriptエラーコードを参照する変数です。
WebScriptの動作中に、エラーを検出した場合、メモリアロケーションエラーまたは通信エラーが発生した場合のエラー コードが設定されます。設定されるエラーコードの詳細は、“付録C WebScriptエラーコード一覧”を参照してください。
フォーマットファイル内で値を設定することはできません。
アプリケーション環境パラメタのWLErrorHandleで、WebScriptのエラー処理を行うことを指定していない場合は、<!
ERRORHANDLE>拡張タグで、WebScriptタイプにONを指定してエラー処理を行うことを指定する必要があります。
SYSTEM::LOGIN_NAME
ログインユーザIDを参照する変数です。
セションのログインユーザIDを参照することができます。
フォーマットファイル内で値を設定することはできません。
SYSTEM::LOGIN_SYSTEM
ログイン中のRDBシステム名を参照する変数です。
セションのRDBシステム名を参照することができます。
フォーマットファイル内で値を設定することはできません。
SYSTEM::LOGIN_DATABASE
アクセス対象のデータベース名を参照する変数です。
ログイン直後の値は、ログインしたときのデータベース名です。
データベース設定文の設定が成功した場合、本変数の値は、データベース設定文に指定されたデータベース名に変更 されます。
本変数の値を変更することはできません。
SYSTEM::LOGIN_SCHEMA
表名の指定時で、スキーマ名を省略した場合に、スキーマ名を参照する変数です。
ログイン直後の値は、ログインしたときのユーザIDです。