MLEでのラージ・オブジェクト(LOB)の使用

MLE JavaScriptドライバでCLOBおよびBLOBを処理するには、PL/SQLラッパー型を使用します。

MLE JavaScriptドライバでのCLOB (キャラクタ・ラージ・オブジェクト)やBLOB (バイナリ・ラージ・オブジェクト)などのラージ・オブジェクトの処理は、node-oracledbドライバとは異なります。Node.jsストリーム・インタフェースを使用するかわりに、PL/SQLラッパー型を使用します。BLOBおよびCLOBのラッパー型は、それぞれOracleBlobおよびOracleClobと呼ばれます。これらは、mle-js-plsqltypesで定義されます。ほとんどのタイプはグローバル・スコープで公開され、モジュールをインポートせずに参照できます。

ノート:

一般的にLOBに属するとされるBFILEはサポートされていません。

関連項目:

mle-js-plsqltypesおよびその他のJavaScript組込みモジュールの詳細は、サーバー側JavaScript APIのドキュメントを参照してください

トピック

LOBの書込み

例は、最終的に表に挿入されるCLOBを初期化し、それに書き込む方法を示しています。

例7-17 表へのCLOBの挿入

この例では、CLOBを表に挿入する方法を示します。この表には、主キーとして使用されるID列とCという名前のCLOB列の2つの列が定義されます。

CREATE TABLE mle_lob_example ( 
    id NUMBER GENERATED ALWAYS AS IDENTITY, 
    CONSTRAINT pk_mle_blob_table PRIMARY KEY(id), 
    c  CLOB 
); 

CREATE OR REPLACE PROCEDURE insert_clob
AS MLE LANGUAGE JAVASCRIPT
{{
//OracleClob is exposed in the global scope and does not require
//importing 'mle-js-plsqltypes', similar to how oracledb is available
let theClob = OracleClob.createTemporary(false);

theClob.open(OracleClob.LOB_READWRITE);
theClob.write(
    1,
    'This is a CLOB and it has been inserted by the MLE JavaScript SQL Driver'
);

const result = session.execute(
    `INSERT INTO mle_lob_example(c) VALUES(:theCLOB)`,
    {
        theCLOB:{
            type: oracledb.ORACLE_CLOB,
            dir: oracledb.BIND_IN,
            val: theCLOB
        }
    }
);

//it is best practice to close the handle to free memory
theCLOB.close();
}};
/

CLOBとBLOBは、mle-js-plsqltypesで定義されています。最も一般的に使用される型は、グローバル・スコープで提供され、mle-js-plsqltypesのインポートのレンダリングが不要になります。

最初のステップでは、キャッシュされていない一時LOBロケータを作成します。LOBが正常に初期化されると、読取りおよび書込み操作のためにオープンされます。文字列は、オフセット1でCLOBに書き込まれます。この時点まで、LOBはメモリー内に存在します。session.execute()をコールすると、CLOBが表に挿入されます。close()メソッドをコールすると、CLOBがクローズされ、関連付けられたメモリーが解放されます。

LOBの読取り

例を使用して、CLOBを選択した後、fetchInfoプロパティを使用してCLOBの内容を文字列として読み取る方法を示します。

データベースからのLOBの読取りは、他の列の読取りと変わりません。例7-18に、例7-17で定義されているプロシージャinsert_clobによって挿入された行をフェッチする方法を示します。

例7-18 LOBの読取り

CREATE OR REPLACE FUNCTION read_clob(
    "p_id" NUMBER
) RETURN VARCHAR2
AS MLE LANGUAGE JAVASCRIPT
{{
const result = session.execute(
    `SELECT c
     FROM mle_lob_example
     WHERE id = :id`,
    {
        id:{
            type: oracledb.NUMBER,
            dir: oracledb.BIND_IN,
            val: p_id
        }
    },
    {
        fetchInfo:{
            "C": {type: oracledb.STRING}
        },
        outFormat: oracledb.OBJECT
    }
);
if (result.rows.length === 0){
    throw new Error(`No data found for ID ${id}`);
} else {
    for (let row of result.rows){
        return row.C;
    }
}
}};
/

ファンクションread_clobは、パラメータとしてIDを受け取ります。これは、CLOBを含む行を識別するために、select文のWHERE句でバインド変数として使用されます。session.execute()を使用して渡されるfetchInfoプロパティは、CLOBを文字列としてフェッチするようデータベースに指示します。