|
フリーの ECMAScript インタプリタ。
Java で記述された JavaScript インタプリタ。 |
Database 拡張は対話式インタプリタでは必ず読み込まれているもので、
JDBC 経由でデータベース機能を提供します。
データベースのメカニズムは Infobus 1.1 のデータベースアクセスインタフェース以降
パターン化されていますが、この拡張は ECMAScript にうまく統合するように
調整したものです。
より一般的な JDBC アクセスは JavaAccess 拡張
でも利用できますが、Database 拡張は、簡単に利用できるアクセスや、
より適したスクリプト言語を提供します。
SQL のエラーは検知できます。一般にエラーの場合には false が返され、
関数 getLastError を使えばエラーオブジェクト (Java の例外です) を
知ることができます。プログラムのエラー (最後のレコードが通知された後に
読み込もうとした場合や解放済みの接続で読み込もうとした場合など) が起きると
すぐに例外がスローされます。
エラーハンドリングの機能を使えば、エラーを心配する必要なく
対話用のスクリプトとして使うことができます。メッセージは
エラーの後の最初のコマンドで生成されます。
しかし同様にエラーステータスをチェックすることもできるので、
あらゆる SQL エラーを捕捉することができます (ECMAScript の
プログラム上のエラーは捕捉されません)。
グローバルなデータベースオブジェクト
グローバルな Database オブジェクトは JDBC 経由での
データベースへのアクセスを実装するために使われます。
Database オブジェクトはプロトタイプで、様々なデータベースを指定して
インスタンス化することができます。
インスタンス化されたオブジェクトは InfoBus の DbAccess プロトコルを
実装しており、データベースに対して接続および切断することができます。
例えば新しいデータベースアクセスのオブジェクトを次のようにして生成できます。
db = new Database("com.sybase.jdbc.SybDriver");
JDBC ドライバはパスに含まれていなくてもかまいません。
引数を 2 つとるバージョンの Detabase 生成ルーチンを使えば次のように
ドライバのパスを指定することができます。
db = new Database("myorg.com.ourDriver","d:\\java\\drivers\\ourDriver")
これは開発中には非常に便利ですが、参照されているルーチンはすべて
そのパスかデフォルトのパスから利用できなければなりません。
Java のネーミングシステムはデフォルトのパスから読み込まれるドライバとは
異なるドライバを生成することに注意して下さい。
データベースオブジェクトを生成したらすぐに getLastError を呼び出して
発生したエラーを調べておくことをお勧めします。この関数は undefined を
返すべきです。それ以外の場合、正しく初期化されていないと最初に使った時点で
データベースオブジェクトはエラーを生成します。
Database オブジェクトの文字列表現は状態 (接続されているか切断されているか) を
含んだものになります。
DbAccess プロトコル
FESI で実装されている通り、DbAccess プロトコルには
以下のルーチンがあります。
-
connect(URL)
-
指定した URL で DbAccess オブジェクト上に新しい接続を開きます。
ドライバが正しく初期化されなかった場合はエラーを生成し、
接続が成功した場合は true を、そうでなければ false を
返します。エラーの詳細を取得するには getLastError を使います。
-
connect(URL, ユーザー名, パスワード)
-
指定したユーザー名とパスワードを使って、
指定した URL で DbAccess オブジェクト上に新しい接続を
開きます。ドライバが正しく初期化されなかった場合はエラーを生成し、
接続が成功した場合は true を、そうでなければ false を
返します。エラーの詳細を取得するには getLastError を使います。
-
disconnect()
-
接続を閉じます (接続されていなければなにもしません)。
ドライバが正しく初期化されなかった場合はエラーを生成し、
切断が成功するかすでに切断されている場合は true を、
そうでなければ false を返します。
エラーの詳細を取得するには getLastError を使います。
-
getLastError()
-
接続やステートメント実行の際に起こった最後のエラーを返します。
なければ undefined を返します。
-
getMetaData()
-
接続に関連付けられたメタデータを返します。
-
release()
-
disconnect と同様ですが、ステータスを返さず、必ず成功します。
これは、多くの場合、関連付けられた RowSet を解放します。
-
executeRetrieval(SQL文字列)
-
SELECT などの、値を返すステートメントの実装に使われているものです。
要求が成功すれば、
RowsetAccess プロトコルを実装した RowSet オブジェクトを
返します。それ以外の場合は false を返します。
それ以上の引数は無視され、データは常に RowsetAccess として返されます。
カーソルは最初の行に置かれます。false が返された場合は、
データベースオブジェクトに対して getLastError を呼べば
エラー情報を取得できます。
接続に失敗した場合は (ステータスを返すのではなく) エラーが生成されるので
注意して下さい。
-
executeCommand(SQL文字列)
-
INSERT、UPDATE、ddl ステートメントや、値を返さない
その他の関数を実装するのに使われています。
要求に成功すると、その影響を受ける行数を返します。
それ以外の場合は false を返します。
false が返された場合は
データベースオブジェクトに対して getLastError を呼べば
エラー情報を取得できます。接続に失敗している場合は (ステータスを返すのでは
なく) エラーが生成されるので注意して下さい。
RowAccess プロトコル (RowSet オブジェクト)
FESI で実装されているように、RowSetAccess プロトコルには
下記のルーチンが含まれます。
-
next()
-
結果の次の行を取得し、次の行があれば true を、なければ false を返します。
next は最初の行にアクセスするより前に呼び出さなければならないので
注意して下さい。
-
hasMoreRows()
-
まだ行がのこっている可能性を楽観的に示します。
現在では next が false を返すような場合にはこれも false を
返すというだけです。このルーチンはいつ呼び出してもかまいません。
-
getLastError()
-
接続やステートメントの実行に際して最後に起こったエラーを返します。
なければ null (false としてテストできます) を返します。
-
getMetaData()
-
この行セットに関連付けられたメタデータを返します。
-
release()
-
この RowSet オブジェクトに関連付けられたリソースを解放します。
解放された後は、そのオブジェクトにアクセスするべきではありません。
release の使用は強制ではありませんが、解放しない場合、その時点では
ガーベッジコレクションが行われないためにそのリソース (大規模キャッシュや
データベース接続) が次のガーベッジコレクションまで利用されなくなりますので、
release を使って解放することをお勧めします。
-
getColumnCount()
-
この結果の桁数を返します。length 属性と同一です。
このルーチンは最初のレコードを取得する前に呼び出すことができます。
-
getColumnName()
-
必ず動作するようなやり方で桁名を取得します。桁名はプロパティとして
アクセスすることができますが、プロパティだと RowSetAccess プロトタイプ
オブジェクトの関数やプロパティが重なってきます。
このルーチンは最初のレコードを取得する前に呼び出すことができます。
-
getColumnDatatypeNumber()
-
この列が関連付けられているデータタイプの番号を返します。
詳しくは JDBC のドキュメンテーションを参照して下さい。
このルーチンは最初のレコードを取得する前に呼び出すことができます。
-
getColumnDatatypeName()
-
この列が関連付けられているデータタイプの名前を返します。
詳しくは JDBC のドキュメンテーションを参照して下さい。
データベースによっては意味のある名前を返しませんが、この場合は undefined が
返されます。
このルーチンは最初の行を取得する前に呼び出すことができます。
-
getColumnItem(name)
-
指定した名前の列の値 (この値は単なる通し番号でアクセスすることもできますが、
FESI では名前の場合より高速になるわけではありません) を取得します。
その名前が next や length といった RowSetAccess プロトコル
のプロパティに使われているものであれば、適切な値が返されます。
レコードが利用できる状態でなければなりません (つまり、
少なくとも 1 度は next が呼ばれていなければなりません)。
さらにいうと、RowSet は、値として任意の桁名のプロパティを返したり、
対応する列の値として通し番号を返したり、列名を列挙したりします。
この列挙には、列名だけが含まれ、プロトタイプやそのオブジェクト自体に加えられた
プロパティは含まれません。
ただし、プロパティとしてアクセスすると、
内部名 (valueOf、toString、length) や
プロトタイプのプロパティ (RowSetAccess プロトコルのルーチンを含む) が
優先されてしまいます。
そのため、通し番号やルーチン getColumnItem によるアクセスの方が
好都合です。
RowSet の文字列表現には、SQL ステートメントと、
戦闘あるいは末尾であればその論理的位置が含まれます。
例
db= new Database("com.sybase.jdbc.SybDriver");
db.connect("jdbc:sybase:Tds:charlie:7078","dba","sql")
result = db.executeRetrieval("select * from employee")
while (result.next()) {
writeln("このレコードには " + result.length + " 列あります");
for (c in result) {
writeln("桁: " + c + ": " + result.getColumnItem(c));
}
}
db.disconnect();
メインページに戻る
最終更新日 (原文): 1999 年 1 月 22 日
(翻訳): 1999 年 4 月 1 日