[JavaScript, Database] Node-oracledb 1.10 has Enhanced Metadata

原文はこちら。
https://blogs.oracle.com/opal/entry/node_oracledb_1_10_has

node-oracledb 1.10がご利用いただけるようになりました。変更点をご紹介します。
oracledb - Oracle Database driver by Oracle Corp
https://www.npmjs.com/package/oracledb
  • Leonardoからのプルリクエストのおかげで、メタデータのクエリが機能強化されました。
    extended metaData #386
    https://github.com/oracle/node-oracledb/pull/386
    Leonardo
    https://github.com/leolmi
    我々が引き継いで実装を微調整することを親切にも許してくれました。
    新しいboolean型の oracledb.extendedMetaData 属性もしくは対応するexecute() オプション属性の extendedMetaData がtrueの場合、クエリのための追加のメタデータとREF CURSOR列がmetaDataオブジェクトで利用可能です。
    extendedMetaData
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#propdbextendedmetadata
    extendedMetaData(execute() : Options)
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#propexecextendedmetadata
    例として、DEPARTMENTS表が以下のような場合を考えます。
    SQL> desc departments
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     DEPARTMENT_ID                             NOT NULL NUMBER(4)
     DEPARTMENT_NAME                           NOT NULL VARCHAR2(30)
     MANAGER_ID                                         NUMBER(6)
     LOCATION_ID                                        NUMBER(4)
    
    このとき、node-oracledbでのクエリでは以下のような拡張メタデータを返します。
    [ { name: 'DEPARTMENT_ID',
           fetchType: 2002,
           dbType: 2,
           precision: 4,
           scale: 0,
           nullable: false },
         { name: 'DEPARTMENT_NAME',
           fetchType: 2001,
           dbType: 1,
           byteSize: 30,
           nullable: false },
         { name: 'MANAGER_ID',
           fetchType: 2002,
           dbType: 2,
           precision: 6,
           scale: 0,
           nullable: true },
         { name: 'LOCATION_ID',
           fetchType: 2002,
           dbType: 2,
           precision: 4,
           scale: 0,
           nullable: true } ]
    利用可能な属性はデータベース型によって様々であることがわかります。属性の説明はmetaDataのドキュメントにあります。
    metaData
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#execmetadata
    extendedMetaDataの値にかかわらず、よく使われる列名は常にmetaDataで利用できます。これは以前のバージョンから変わりません。
    メタデータのdbType と fetchType という属性値はそれぞれ、新たなDB_TYPE_*  定数と既存のnode-oracledb型定数で表現されます。
    Oracle Database Type Constants
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#oracledbconstantsdbtype
    Node-oracledb Type Constants
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#oracledbconstantsnodbtype
    メタデータのタイプをチェックする際、みなさんのコードでこれらの定数を使っている必要があります。
  • 余分なメタデータをオプションにし、デフォルトでオフにしたり、データ型として文字列ではなく数字を利用したりしている理由は、一般的なユースケース、標準機能としてのエクスペリエンス、パフォーマンス、などについて議論を繰り返した結果です。
  • この機能強化の結果、みなさんのアプリケーションのメンテナンスが容易になり、より強力になると思っています。
  • LOBを伴うクエリ時にLOBデータがストリーミングされない場合に、ガベージコレクタがクリーンアップできない問題を解決しました。
  • 名前付きバインドオブジェクトを位置によるバインド(bind-by-position)コンテキストで使用した場合に、エラー(新しいエラーNJS-044)を返すようになりました。以前は、想定される属性が見つからず、バインド設定がデフォルトで最終的にデフォルトのままだったので、ORA-06502のようなエラーを返していました。引き続き、位置によるバインド(bind-by-position)で無名オブジェクトを使用することもできます。以下はその例です。
  • var sql = "begin myproc(:1, :2, :3); end;";
    var binds = [ id, name, { type: oracledb.STRING, dir: oracledb.BIND_OUT } ];
    
    3番目の配列要素が無名オブジェクトです。
  • 根底にあるResultSetがクローズされる前にQueryStreamインスタンスでエラーイベントが発生した場合の不具合を修正しました。ユーザがエラー・イベントハンドラで接続をクローズしようとした場合、ResultSetが接続クローズを妨げるため、問題が発生する可能性がありました。
  • getRows呼び出し中にエラーが発生した場合、QueryStreamインスタンスの基礎となるResultSetインスタンスでパブリックなcloseメソッドを呼び出したとき不具合を修正しました。QueryStreamインスタンスがtoQueryStreamメソッドを使ってResultSetインスタンスから生成されると、このパブリックなメソッドはエラーを送出します。Cレイヤーのcloseメソッドの呼び出しは直接呼び出されます。
  • Pool._logStats をアップデートし、プールが正しくない場合にコンソールへ表示するのではなく、エラーを送出するようにしました。
  • GitHub Issue and Pull Requestテンプレートを追加しました。
    GitHub Issue and PR templates
    https://github.com/oracle/node-oracledb/tree/master/.github
  • 新しいInstant Client 12.1リリースに対応した、OS Xへのインストール手順を更新しました。
  • AIX、Solaris x64に対応したインストール手順を追加しました。
  • 基礎となるDPIデータアクセス層に対する機能強化を実施しました。
    https://github.com/oracle/node-oracledb/tree/master/src/dpi
    この機能強化はnode-oracledbを使っていないDPIの利用者とともに実施しました。この変更によって、潜在的な、ユーザーに見える、node-oracledbの機能強化のための基礎が築かれます。
    • SYSDBA接続を許可します
    • セッションのタグ付けを許可します
    • 文字セットと各国文字セットをDPI総へのパラメータを使って指定します
    • (既存の均質なプールに加え)異種混在のプールをサポートします
    繰り返しになりますが、これらはnode-oracledbに公開されません。

Resources

node-oracledbに関する問題や質問があれば、GitHubに投稿してください。みなさまからの投稿がadd-onに対する作業のスケジューリングの助けになります。よろしくお願いします。
node-oracledb : Issues
https://github.com/oracle/node-oracledb/issues
node-oracledbのインストール手順
https://github.com/oracle/node-oracledb/blob/master/INSTALL.md
node-oracledbのドキュメント
https://github.com/oracle/node-oracledb/blob/master/doc/api.md

0 件のコメント:

コメントを投稿