コンストラクタの概要

TenantDatabase ()
コンストラクタ。

プロパティの概要

プロパティ名 アクセス権
String connectId
接続先のID
読み取り専用
String dataSourceName
JNDI名
読み取り専用
String databaseName
"Oracle", "PostgreSQL", "SQLServer" のいずれか
読み取り専用

メソッドの概要

返却値の型 メソッド名
DatabaseResult executeByTemplate (String path, Object [params])
2WaySQL を実行します。
DatabaseResult executeCallable (String sql, Array [params])
ストアドプロシージャ/ファンクションを実行します。
DatabaseResult execute (String sql, Array [params])
任意のSQL文を実行します。
DatabaseResult fetchByTemplate (String path, Number start, Number length, Object [params])
2WaySQL を実行します。
DatabaseResult fetch (String sql, Number start, Number length, Array [params])
SELECT文を発行後、取得データをフェッチして取得します。
DatabaseResult getByteReader (String tableName, String columnName, String condition, Array [params], Function [callback])
BLOB または InputStream を取得し、それを元に ByteReader を返します。
DatabaseResult getMetaData ()
データベースのメタデータを取得します。
DatabaseResult getTextReader (String tableName, String columnName, String condition, Array [params], Function [callback])
CLOB または Reader を取得し、それを元に TextReader を返します。
DatabaseResult insert (String tableName, Object insertData)
指定されたテーブルにデータを挿入します。
Boolean isIncludeClobData ()
SQL実行時に、CLOB型のカラムに格納されているテキストデータの取得結果を変更するフラグを取得します。
Boolean isUseBigDecimal ()
decimal/numeric型のカラムの取得方法を変更するフラグを取得します。
DatabaseResult remove (String tableName, String condition, Array [params])
データベースデータを削除します。
DatabaseResult select (String sql, Array [params], Number [length])
SELECT文を発行してデータを取得します。
void setIncludeClobData (Boolean includeClobData)
SQL実行時に、CLOB型のカラムに格納されているテキストデータの取得結果を変更するフラグを設定します。
void setUseBigDecimal (Boolean useBigDecimal)
decimal/numeric型のカラムの取得方法を変更するフラグを設定します。
DatabaseResult update (String tableName, Object updateData, String condition, Array [params])
データベースのデータを更新します。

コンストラクタの詳細

TenantDatabase ()
コンストラクタ。

プロパティの詳細

String connectId 読み取り専用
接続先のID
String dataSourceName 読み取り専用
JNDI名
String databaseName 読み取り専用
"Oracle", "PostgreSQL", "SQLServer" のいずれか

メソッドの詳細

DatabaseResult executeByTemplate (String path, Object [params])
2WaySQL を実行します。

例1:
  • example1.sql
     SELECT * FROM b_m_account_b
     
  • example1.js
     var db     = new TenantDatabase();
     var result = db.executeByTemplate('example1');
    
     if (!result.error) {
         result.data.forEach(function(e) {
             Debug.print(e);
         });
     }
     

例2(パラメータ):
example2.sql の /*hoge*/'bar' を 'Hoge', /*parameter.foo*/'baz' を 'Foo' にして(PreparedStatement を利用して)SQL を発行します。
SQLファイル中では、パラメータオブジェクトに渡したオブジェクトのプロパティを変数として使用できます。
また、Ver.8.0.4 以降ではパラメータオブジェクト「parameters」を経由して参照することもできます。
example2.sql は、そのままツールに流すことによって、SQL の構文の正しさを確認できるようになっていることに注意してください。
  • example2.sql
     SELECT
       *
     FROM
       b_m_account_b
     WHERE
       user_cd LIKE /*hoge*/'bar' OR user_cd LIKE /*parameters.foo*/'baz'
     
  • example2.js
     new TenantDatabase().executeByTemplate('example2', {
         hoge: DbParameter.string('Hoge'),
         foo: DbParameter.string('Foo')
     });
     

例3(置換):
order by パラメータは PreparedStatement で渡せないので、単純な文字列置換で置き換える仕組みを用意しています
(SQL ファイル中の、$ で始まるバインド変数、あるいは名前が orderBy なバインド変数が、置換の対象となります)。
  • example3.sql
     SELECT
       *
     FROM
       b_m_account_b
     ORDER BY
       /*$hoge*/user_cd
     
  • example3.js
     new TenantDatabase().executeByTemplate('example3', {
         hoge: 'locale_id'
     });
     

例4(パラメータその2):
SQL 中に ? を書くと、その出現順に引数の $1, $2, …, $N プロパティの値に置き換えて(内部で PreparedStatement を利用しています) SQL を発行します。
  • example4.sql
     SELECT
       *
     FROM
       b_m_account_b
     WHERE
       user_cd LIKE ? AND
       locale_id LIKE ?
     
  • example4.js
     new TenantDatabase().executeByTemplate('example4', {
         $1: DbParameter.string('foo'),
         $2: DbParameter.string('bar')
     });
     

例5(パラメータその3):
パラメータを配列で渡し、SQLを発行します。
  • example5.sql
     SELECT
       *
     FROM
       b_m_account_b
     WHERE
       user_cd IN /*param*/('hoge','foo')
     
  • example5.js
     new TenantDatabase().executeByTemplate('example5', {
         param: [
             DbParameter.string('bar'),
             DbParameter.string('baz')
         ]
     });
     

例6(条件分岐):
/*IF …*/ /*END*/ により、条件によって動的に発行する SQL を変更できます。
  • example6.sql
     SELECT
       *
     FROM
       b_m_account_b
     WHERE
       /*IF doSomething()*/
       user_cd = /*hoge*/'bar'
       /*END*/
       /*IF flag*/
       AND valid_start_date <= /*foo*/'2000-02-22 00:00:00'
       AND /*foo*/'2000-02-22 00:00:00' < valid_end_date
       /*END*/
     
  • example6.js
     new TenantDatabase().executeByTemplate('example6', {
         doSomething: function() {
             return true;
         },
         flag: true,
         hoge:  DbParameter.string('bar'),
         foo: DbParameter.date(new Date())
     });
     

例7(条件分岐その2):
example6.sql は、start() が false かつ end() が false などの場合に不正な SQL になることに注意してください。
(start, end の値によっては、SQL が WHERE で終了したり、WHERE の直後に AND が来る場合があるため)。
この問題を解決するために、/*BEGIN*/ /*END*/ を使います。
BEGIN, END を使うと、すべての条件が不成立だった場合 WHERE そのものを SQL から消し、最初に成立した条件が AND であった場合には、AND を除去する動作を行います。
  • example7.sql
     SELECT
       *
     FROM
       b_m_account_b
     /*BEGIN*/
     WHERE
       /*IF doSomething()*/
       user_cd = /*hoge*/'bar'
       /*END*/
       /*IF flag*/
       AND valid_start_date <= /*foo*/'2000-02-22 00:00:00'
       AND /*foo*/'2000-02-22 00:00:00' < valid_end_date
       /*END*/
     /*END*/
     
  • example7.js
     new TenantDatabase().executeByTemplate('example7', {
         doSomething: function() {
             return true;
         },
         flag: true,
         hoge:  DbParameter.string('bar'),
         foo: DbParameter.date(new Date())
     });
     
パラメータ
path : String
スクリプト実行箇所からの実行したいSQLのパス
jssp-config/source-path/generalを以下のように設定している場合:
<directory>jssp/src</directory>
<directory>jssp/product/src</directory>
<directory>jssp/platform/src</directory>

読み込まれるファイルは次のようになります。
第一引数に渡したパラメータが 'sample/test' の場合、まずデータベース名のサフィクスが付いた SQL ファイル(例: sample/test_oracle.sql)を、jssp/src, jssp/product/src, jssp/platform/src の順番で見つかるまで探します。 見つからない場合、同様に sample/test.sql を見つかるまで探します。 サフィックスに使われるデータベース名は以下の通りです。
  • Oracle を使っている場合
    • oracle
  • PostgreSQL を使っている場合
    • postgre
  • SQLServer を使っている場合
    • sqlserver
例えば、データベースに Oracle を使っていて、'sample/test' を引数に渡し、かつ jssp/src/sample/test_oracle.sql ファイルが存在する場合、このファイルが読み込まれることになります。
[params] : Object
SQL文に渡すパラメータのオブジェクト
ここで指定したパラメータオブジェクトは、Ver.8.0.4 以降では、SQLファイル中では名前がparametersなオブジェクトとして取得できます

注意事項
次のプロパティを持つオブジェクトは、予約されているため指定できません
  • 名前が「parameters」であるプロパティ
  • 名前が「im」で始まり「_」で終わるプロパティ
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
DatabaseResult executeCallable (String sql, Array [params])
ストアドプロシージャ/ファンクションを実行します。 このメソッドは intra-mart Accel Platform 2017 Winter(8.0.18)(データベースアクセスモジュール(スクリプト開発向け)モジュールバージョン 8.0.13)から利用可能です。
各 DBMS のカラム型と DbParameter は以下の組み合わせのみをサポートします。

PostgreSQL
カラム種別 カラム型 パラメータ型
文字列型 varchar DbParameter.TYPE_STRING
char DbParameter.TYPE_CHAR
text DbParameter.TYPE_STRING
数値型 numeric DbParameter.TYPE_NUMERIC
float8 DbParameter.TYPE_NUMBER
float4 DbParameter.TYPE_REAL
int8 DbParameter.TYPE_BIGINT
int4 DbParameter.TYPE_INTEGER
int2 DbParameter.TYPE_SMALLINT
日付型 time DbParameter.TYPE_TIME
date DbParameter.TYPE_DATE
timestamp DbParameter.TYPE_TIMESTAMP
バイナリ型 bytea DbParameter.TYPE_BINARY
真偽値型 bool DbParameter.TYPE_BOOLEAN
カーソル型 refcursor DbParameter.TYPE_CURSOR

Oracle
clobは、 setIncludeClobDataをtrueに設定することで、SQLの戻り値に含まれるようになります。
setIncludeClobDataは, intra-mart Accel Platform 2023 Autumn(8.0.34)(データベースアクセスモジュール(スクリプト開発向け)モジュールバージョン 8.0.16)から利用可能です。
カラム種別 カラム型 パラメータ型
文字列型 varchar2 DbParameter.TYPE_STRING
nvarchar2 DbParameter.TYPE_STRING
char DbParameter.TYPE_CHAR
long DbParameter.TYPE_STRING
数値型 number DbParameter.TYPE_NUMERIC
float DbParameter.TYPE_NUMERIC
日付型 date DbParameter.TYPE_TIMESTAMP
timestamp DbParameter.TYPE_TIMESTAMP
バイナリ型 long raw DbParameter.TYPE_BINARY
LOB型 blob 対応していません
clob DbParameter.TYPE_CLOB
カーソル型 refcursor DbParameter.TYPE_CURSOR

SQL Server
カラム種別 カラム型 パラメータ型
文字列型 char DbParameter.TYPE_CHAR
nchar DbParameter.TYPE_CHAR
nvarchar DbParameter.TYPE_NSTRING
varchar DbParameter.TYPE_STRING
数値型 bigint DbParameter.TYPE_BIGINT
decimal DbParameter.TYPE_NUMERIC
float DbParameter.TYPE_NUMBER
int DbParameter.TYPE_INTEGER
money DbParameter.TYPE_NUMERIC
numeric DbParameter.TYPE_NUMERIC
real DbParameter.TYPE_REAL
smallint DbParameter.TYPE_SMALLINT
smallmoney DbParameter.TYPE_NUMERIC
tinyint DbParameter.TYPE_SMALLINT
日付型 date DbParameter.TYPE_DATE
datetime DbParameter.TYPE_TIMESTAMP
datetime2 DbParameter.TYPE_TIMESTAMP
smalldatetime DbParameter.TYPE_TIMESTAMP
バイナリ型 binary DbParameter.TYPE_BINARY
varbinary DbParameter.TYPE_BINARY
真偽値型 bit DbParameter.TYPE_BOOLEAN
カーソル型 N/A DbParameter.TYPE_CURSOR

例1: PostgreSQL 戻り値が numeric の場合
SQL
 CREATE TABLE my_table1(numeric_column numeric)
 INSERT INTO my_table1 VALUES(10)

 CREATE OR REPLACE FUNCTION my_func1()
 RETURNS numeric AS '
     SELECT numeric_column FROM my_table1;
 ' LANGUAGE SQL;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ ? = call my_func1() }", // 関数 my_func1 を実行
         [DbParameter.paramOut(DbParameter.TYPE_NUMERIC)] // 関数 my_func1 の戻り値(1個目の「?」パラメータ)は DbParameter.TYPE_NUMERIC(上記表から、PostgreSQL numeric 型のカラムは DbParameter.TYPE_NUMERIC を使用するため)
     );

     if (!result.error) {
         Debug.print(result.params[0]); // 「?」の戻り値は params 変数に返却される。一個目の「?」の戻り値は params[0] に格納される
     }
 });
例2: Oracle 戻り値が timestamp の場合
SQL
 CREATE TABLE my_table2(timestamp_column timestamp)
 INSERT INTO my_table2 VALUES('2000-01-01 00:00:00')

 CREATE OR REPLACE FUNCTION my_func2
 RETURN my_table2.timestamp_column%TYPE
 IS
     timestamp_column my_table2.timestamp_column%TYPE;
 BEGIN
     SELECT timestamp_column into timestamp_column FROM my_table2;
     RETURN timestamp_column;
 END my_func2;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ ? = call my_func2() }", // 関数 my_func2 を実行
         [DbParameter.paramOut(DbParameter.TYPE_TIMESTAMP)] // 関数 my_func2 の戻り値(1個目の「?」パラメータ)は DbParameter.TYPE_TIMESTAMP(上記表から、Oracle timestamp 型のカラムは DbParameter.TYPE_TIMESTAMP を使用するため)
     );

     if (!result.error) {
         Debug.print(result.params[0]); // 「?」の戻り値は params 変数に返却される。一個目の「?」の戻り値は params[0] に格納される
     }
 });
例3: SQL Server 戻り値が varchar の場合
注意)SQL Server は SelectMethod=cursor を指定時に UDFs を実行できません(参考:Execution of User Defined Function fails with JDBC, when selectMethod=cursor is enabled
SQL
 CREATE TABLE my_table3(varchar_column varchar(128))
 INSERT INTO my_table3 VALUES('test')

 CREATE FUNCTION my_func3()
 RETURNS varchar(128)
 AS
 BEGIN
     DECLARE @varchar_column varchar(128);
     SELECT @varchar_column = varchar_column FROM my_table3;
     RETURN @varchar_column;
 END;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ ? = call my_func3() }", // 関数 my_func3 を実行
         [DbParameter.paramOut(DbParameter.TYPE_STRING)] // 関数 my_func3 の戻り値(1個目の「?」パラメータ)は DbParameter.TYPE_STRING(上記表から、SQL Server varchar 型のカラムは DbParameter.TYPE_STRING を使用するため)
     );

     if (!result.error) {
         Debug.print(result.params[0]); // 「?」の戻り値は params 変数に返却される。一個目の「?」の戻り値は params[0] に格納される
     }
 });
例4: PostgreSQL 戻り値が refcursor の場合
SQL
 CREATE TABLE my_table4(numeric_column numeric, varchar_column varchar(128))
 INSERT INTO my_table4 VALUES(1, 'test1')
 INSERT INTO my_table4 VALUES(2, 'test2')

 CREATE OR REPLACE FUNCTION my_func4()
 RETURNS refcursor AS'
 DECLARE
     mycurs refcursor;
 BEGIN
     OPEN mycurs FOR SELECT * FROM my_table4;
 RETURN mycurs;
 END; ' language 'plpgsql'
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ ? = call my_func4() }", // 関数 my_func4 を実行
         [DbParameter.paramOut(DbParameter.TYPE_CURSOR)] // 関数 my_func4 の戻り値(1個目の「?」パラメータ)は DbParameter.TYPE_CURSOR(上記表から、PostgreSQL refcursor 型のカラムは DbParameter.TYPE_CURSOR を使用するため)
     );

     if (!result.error) {
         // 「?」の戻り値は params 変数に返却される。一個目の「?」の戻り値は params[0] に格納される
         Debug.print(result.params[0][0].numeric_column); // 1
         Debug.print(result.params[0][0].varchar_column); // 'test1'
         Debug.print(result.params[0][1].numeric_column); // 2
         Debug.print(result.params[0][1].varchar_column); // 'test2'
     }
 });
例5: Oracle 戻り値が refcursor の場合
SQL
 CREATE TABLE my_table5(number_column number, varchar2_column varchar2(128))
 INSERT INTO my_table5 VALUES(1, 'test1')
 INSERT INTO my_table5 VALUES(2, 'test2')

 CREATE OR REPLACE FUNCTION my_func5
 RETURN SYS_REFCURSOR
 IS
    cur SYS_REFCURSOR;
 BEGIN
    OPEN cur FOR SELECT * FROM my_table5;
    RETURN cur;
 END my_func5;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ ? = call my_func5() }", // 関数 my_func5 を実行
         [DbParameter.paramOut(DbParameter.TYPE_CURSOR)] // 関数 my_func5 の戻り値(1個目の「?」パラメータ)は DbParameter.TYPE_CURSOR(上記表から、Oracle refcursor 型のカラムは DbParameter.TYPE_CURSOR を使用するため)
     );

     if (!result.error) {
         // 「?」の戻り値は params 変数に返却される。一個目の「?」の戻り値は params[0] に格納される
         Debug.print(result.params[0][0].number_column);   // 1
         Debug.print(result.params[0][0].varchar2_column); // 'test1'
         Debug.print(result.params[0][1].number_column);   // 2
         Debug.print(result.params[0][1].varchar2_column); // 'test2'
     }
 });
例6: SQL Server 戻り値がカーソル型の場合
SQL
 CREATE TABLE my_table6(numeric_column numeric, varchar_column varchar(128))
 INSERT INTO my_table6 VALUES(1, 'test1')
 INSERT INTO my_table6 VALUES(2, 'test2')

 CREATE PROCEDURE my_proc6
 AS
 BEGIN
     SELECT * FROM my_table6;
 END;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc6() }" // 関数 my_proc6 を実行(SQL Server の上記のストアドの場合、戻り値は不要)
     );

     if (!result.error) {
         // 戻り値は data 変数に返却される。
         Debug.print(result.data[0].numeric_column); // 1
         Debug.print(result.data[0].varchar_column); // 'test1'
         Debug.print(result.data[1].numeric_column); // 2
         Debug.print(result.data[1].varchar_column); // 'test2'
     }
 });
例7: SQL Server 戻り値が複数のカーソル型の場合
SQL
 CREATE TABLE my_table7_1(numeric_column numeric, varchar_column varchar(128))
 CREATE TABLE my_table7_2(numeric_column numeric, varchar_column varchar(128))
 INSERT INTO my_table7_1 VALUES(1, 'test1')
 INSERT INTO my_table7_1 VALUES(2, 'test2')
 INSERT INTO my_table7_2 VALUES(3, 'test3')
 INSERT INTO my_table7_2 VALUES(4, 'test4')

 CREATE PROCEDURE my_proc7
 AS
 BEGIN
     SELECT * FROM my_table7_1;
     SELECT * FROM my_table7_2;
 END;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc7() }" // 関数 my_proc7 を実行(SQL Server の上記のストアドの場合、戻り値は不要)
     );

     if (!result.error) {
         // 戻り値は data 変数に返却される。my_table7_1 は data[0] に、my_table7_2 は data[1] に格納される。
         // my_table7_1
         Debug.print(result.data[0][0].numeric_column); // 1
         Debug.print(result.data[0][0].varchar_column); // 'test1'
         Debug.print(result.data[0][1].numeric_column); // 2
         Debug.print(result.data[0][1].varchar_column); // 'test2'
         // my_table7_2
         Debug.print(result.data[1][0].numeric_column); // 3
         Debug.print(result.data[1][0].varchar_column); // 'test3'
         Debug.print(result.data[1][1].numeric_column); // 4
         Debug.print(result.data[1][1].varchar_column); // 'test4'
     }
 });
例8: PostgreSQL INパラメータとOUTパラメータ
SQL
 CREATE OR REPLACE FUNCTION my_proc8(in param1 text, out param2 text)
 RETURNS text AS $$
 BEGIN
     param2 := param1;
 END;
 $$ LANGUAGE plpgsql;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc8(?, ?) }", // 関数 my_proc8 を実行
         [
             DbParameter.string('text'), // INパラメータ(上記の表から PostgreSQL text 型のカラムは DbParameter.TYPE_STRING)
             DbParameter.paramOut(DbParameter.TYPE_STRING) // OUTパラメータ(上記の表から PostgreSQL text 型のカラムは DbParameter.TYPE_STRING)
         ]
     );

     if (!result.error) {
         Debug.print(result.params[0]); // "test"(1番目の「?」はINパラメータなので、渡した値がそのままコピーされる)
         Debug.print(result.params[1]); // "test"(2番目の「?」はOUTパラメータなので、出力値が設定される)
     }
 });
例9: Oracle INパラメータとOUTパラメータ
SQL
 CREATE OR REPLACE PROCEDURE my_proc9(param1 in long raw, param2 out long raw)
 IS
 BEGIN
     param2 := param1;
 END my_proc9;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc9(?, ?) }", // 関数 my_proc9 を実行
         [
             DbParameter.binary([1, 2, 3]), // INパラメータ(上記の表から Oracle long raw 型のカラムは DbParameter.TYPE_BINARY)
             DbParameter.paramOut(DbParameter.TYPE_BINARY) // OUTパラメータ(上記の表から Oracle long raw 型のカラムは DbParameter.TYPE_BINARY
         ]
     );

     if (!result.error) {
         Debug.print(result.params[0]); // [1, 2, 3](1番目の「?」はINパラメータなので、渡した値がそのままコピーされる)
         Debug.print(result.params[1]); // [1, 2, 3] をデータとして持つ ByteReader(2番目の「?」はOUTパラメータなので、出力値が設定される)
     }
 });
例10: SQL Server INパラメータとOUTパラメータ
SQL
 CREATE PROCEDURE my_proc10(@param1 bit, @param2 bit OUTPUT)
 AS
 BEGIN
     SET @param2 = @param1;
 END;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc10(?, ?) }", // 関数 my_proc10 を実行
         [
             DbParameter.boolean(true), // INパラメータ(上記の表から SQL Server bit 型のカラムは DbParameter.TYPE_BOOLEAN
             DbParameter.paramOut(DbParameter.TYPE_BOOLEAN) // OUTパラメータ(上記の表から SQL Server bit 型のカラムは DbParameter.TYPE_BOOLEAN
         ]
     );

     if (!result.error) {
         Debug.print(result.params[0]); // true(1番目の「?」はINパラメータなので、渡した値がそのままコピーされる)
         Debug.print(result.params[1]); // true(2番目の「?」はOUTパラメータなので、出力値が設定される)
     }
 });
例11: PostgreSQL INOUTパラメータ
SQL
 CREATE OR REPLACE FUNCTION my_proc11(inout param varchar)
 RETURNS varchar AS $$
 BEGIN
   param := upper(param);
 END;
 $$ LANGUAGE plpgsql;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc11(?) }", // 関数 my_proc11 を実行
         [DbParameter.string('test').paramInOut()] // INOUTパラメータ(上記の表から PostgreSQL varchar 型のカラムは DbParameter.TYPE_STRING
     );

     if (!result.error) {
         Debug.print(result.params[0]); // "TEST"(1番目の「?」はINOUTパラメータなので、出力値が設定される)
     }
 });
例12: Oracle INOUTパラメータ
SQL
 CREATE OR REPLACE PROCEDURE my_proc12(param in out varchar2)
 IS
 BEGIN
     param := UPPER(param);
 END my_proc12;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc12(?) }", // 関数 my_proc12 を実行
         [DbParameter.string('test').paramInOut()] // INOUTパラメータ(上記の表から Oracle varchar2 型のカラムは DbParameter.TYPE_STRING
     );

     if (!result.error) {
         Debug.print(result.params[0]); // "TEST"(1番目の「?」はINOUTパラメータなので、出力値が設定される)
     }
 });
例13: SQL Server INOUTパラメータ
SQL
 CREATE PROCEDURE my_proc13(@param varchar(128) OUTPUT)
 AS
 BEGIN
     SET @param = UPPER(@param);
 END;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc13(?) }", // 関数 my_proc13 を実行
         [DbParameter.string('test').paramInOut()] // INOUTパラメータ(上記の表から SQL Server varchar 型のカラムは DbParameter.TYPE_STRING
     );

     if (!result.error) {
         Debug.print(result.params[0]); // "TEST"(1番目の「?」はINOUTパラメータなので、出力値が設定される)
     }
 });
例14: Oracle INOUTパラメータ(number, float)
Oracle の number もしくは float の INOUT パラメータに null を渡す際には null ではなく DbParameter.NULL を利用してください。
SQL
 CREATE OR REPLACE PROCEDURE my_proc14_1(param in out number)
 IS
 BEGIN
     param := null;
 END my_proc14_1;

 CREATE OR REPLACE PROCEDURE my_proc14_2(param in out float)
 IS
 BEGIN
     param := null;
 END my_proc14_2;
JavaScript
 Transaction.begin(function() {
     var db     = new TenantDatabase();
     var result = db.executeCallable(
         "{ call my_proc14_1(?) }", // 関数 my_proc14_1 を実行
         [DbParameter.numeric(DbParameter.NULL).paramInOut()] // Oracle の number もしくは float の INOUT パラメータに null を渡す際には null ではなく DbParameter.NULL を利用
     );

     if (!result.error) {
         Debug.print(result.params[0]);
     }

     result = db.executeCallable(
         "{ call my_proc14_2(?) }", // 関数 my_proc14_2 を実行
         [DbParameter.numeric(DbParameter.NULL).paramInOut()] // Oracle の number もしくは float の INOUT パラメータに null を渡す際には null ではなく DbParameter.NULL を利用
     );

     if (!result.error) {
         Debug.print(result.params[0]);
     }
 });
パラメータ
sql : String
SQL文
[params] : Array
SQL文に渡すパラメータの配列(DbParameter の配列)
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
DatabaseResult execute (String sql, Array [params])
任意のSQL文を実行します。
パラメータ
sql : String
SQL文
[params] : Array
SQL文に渡すパラメータの配列(DbParameter の配列)
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
DatabaseResult fetchByTemplate (String path, Number start, Number length, Object [params])
2WaySQL を実行します。

例1:
  • example1.sql
     SELECT * FROM b_m_account_b
     
  • example1.js
     var db     = new TenantDatabase();
     var result = db.fetchByTemplate('example1', 1, 10);
    
     if (!result.error) {
         result.data.forEach(function(e) {
             Debug.print(e);
         });
     }
     

例2(パラメータ):
example2.sql の /*hoge*/'bar' を 'Hoge', /*parameter.foo*/'baz' を 'Foo' にして(PreparedStatement を利用して)SQL を発行します。
SQLファイル中では、パラメータオブジェクトに渡したオブジェクトのプロパティを変数として使用できます。
また、Ver.8.0.4 以降ではパラメータオブジェクト「parameters」を経由して参照することもできます。
example2.sql は、そのままツールに流すことによって、SQL の構文の正しさを確認できるようになっていることに注意してください。
  • example2.sql
     SELECT
       *
     FROM
       b_m_account_b
     WHERE
       user_cd LIKE /*hoge*/'bar' OR user_cd LIKE /*parameters.foo*/'baz'
     
  • example2.js
     new TenantDatabase().fetchByTemplate('example2', 1, 10, {
         hoge: DbParameter.string('Hoge'),
         foo: DbParameter.string('Foo')
     });
     

例3(置換):
order by パラメータは PreparedStatement で渡せないので、単純な文字列置換で置き換える仕組みを用意しています
(SQL ファイル中の、$ で始まるバインド変数、あるいは名前が orderBy なバインド変数が、置換の対象となります)。
  • example3.sql
     SELECT
       *
     FROM
       b_m_account_b
     ORDER BY
       /*$hoge*/user_cd
     
  • example3.js
     new TenantDatabase().fetchByTemplate('example3', 1, 10, {
         hoge: 'locale_id'
     });
     

例4(パラメータその2):
SQL 中に ? を書くと、その出現順に引数の $1, $2, …, $N プロパティの値に置き換えて(内部で PreparedStatement を利用しています) SQL を発行します。
  • example4.sql
     SELECT
       *
     FROM
       b_m_account_b
     WHERE
       user_cd LIKE ? AND
       locale_id LIKE ?
     
  • example4.js
     new TenantDatabase().fetchByTemplate('example4', 1, 10, {
         $1: DbParameter.string('foo'),
         $2: DbParameter.string('bar')
     });
     

例5(パラメータその3):
パラメータを配列で渡し、SQLを発行します。
  • example5.sql
     SELECT
       *
     FROM
       b_m_account_b
     WHERE
       user_cd IN /*param*/('hoge', 'foo')
     
  • example5.js
     new TenantDatabase().fetchByTemplate('example5', 1, 10, {
         param: [
             DbParameter.string('bar'),
             DbParameter.string('baz')
         ]
     });
     

例6(条件分岐):
/*IF …*/ /*END*/ により、条件によって動的に発行する SQL を変更できます。
  • example6.sql
     SELECT
       *
     FROM
       b_m_account_b
     WHERE
       /*IF doSomething()*/
       user_cd = /*hoge*/'bar'
       /*END*/
       /*IF flag*/
       AND valid_start_date <= /*foo*/'2000-02-22 00:00:00'
       AND /*foo*/'2000-02-22 00:00:00' < valid_end_date
       /*END*/
     
  • example6.js
     new TenantDatabase().fetchByTemplate('example6', 1, 10, {
         doSomething: function() {
             return true;
         },
         flag: true,
         hoge:  DbParameter.string('bar'),
         foo: DbParameter.date(new Date())
     });
     

例7(条件分岐その2):
example6.sql は、start() が false かつ end() が false などの場合に不正な SQL になることに注意してください
(start, end の値によっては、SQL が WHERE で終了したり、WHERE の直後に AND が来る場合があるため)。
この問題を解決するために、/*BEGIN*/ /*END*/ を使います。
BEGIN, END を使うと、すべての条件が不成立だった場合 WHERE そのものを SQL から消し、最初に成立した条件が AND であった場合には、AND を除去する動作を行います。
  • example7.sql
     SELECT
       *
     FROM
       b_m_account_b
     /*BEGIN*/
     WHERE
       /*IF doSomething()*/
       user_cd = /*hoge*/'bar'
       /*END*/
       /*IF flag*/
       AND valid_start_date <= /*foo*/'2000-02-22 00:00:00'
       AND /*foo*/'2000-02-22 00:00:00' < valid_end_date
       /*END*/
     /*END*/
     
  • example7.js
     new TenantDatabase().fetchByTemplate('example7', 1, 10, {
         doSomething: function() {
             return true;
         },
         flag: true,
         hoge:  DbParameter.string('bar'),
         foo: DbParameter.date(new Date())
     });
     
パラメータ
path : String
スクリプト実行箇所からの実行したいSQLのパス
jssp-config/source-path/generalを以下のように設定している場合:
<directory>jssp/src</directory>
<directory>jssp/product/src</directory>
<directory>jssp/platform/src</directory>

読み込まれるファイルは次のようになります。
第一引数に渡したパラメータが 'sample/test' の場合、まずデータベース名のサフィクスが付いた SQL ファイル(例: sample/test_oracle.sql)を、jssp/src, jssp/product/src, jssp/platform/src の順番で見つかるまで探します。 見つからない場合、同様に sample/test.sql を見つかるまで探します。 サフィックスに使われるデータベース名は以下の通りです。
  • Oracle を使っている場合
    • oracle
  • PostgreSQL を使っている場合
    • postgre
  • SQLServer を使っている場合
    • sqlserver
例えば、データベースに Oracle を使っていて、'sample/test' を引数に渡し、かつ jssp/src/sample/test_oracle.sql ファイルが存在する場合、このファイルが読み込まれることになります。
start : Number
取得するデータの開始レコード位置(1以上)
length : Number
取得するデータの最大レコード数(0以上、0の場合、start以降の全件)
[params] : Object
SQL文に渡すパラメータのオブジェクト
ここで指定したパラメータオブジェクトは、Ver.8.0.4 以降では、SQLファイル中では名前がparametersなオブジェクトとして取得できます

注意事項
次のプロパティを持つオブジェクトは、予約されているため指定できません
  • 名前が「parameters」であるプロパティ
  • 名前が「im」で始まり「_」で終わるプロパティ
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
DatabaseResult fetch (String sql, Number start, Number length, Array [params])
SELECT文を発行後、取得データをフェッチして取得します。

(注意)Microsoft SQL Serverに対してこのメソッドを利用する場合、以下の制約があります。
SQL Server フェッチのパフォーマンスを向上させるために、このメソッド内でSQL文を加工して、SQLを発行します。
そのため、select文に対してTOP句が利用できません。
ただし、サブクエリに対してはSQL Serverの制約に準じます。

select文にてTOP句を利用したい場合または、SQL構文エラーなどが発生する場合は
SQL Server 2000モードで動作させてください。

パラメータ
sql : String
SQL(SELECT文)
start : Number
取得するデータの開始レコード位置(1以上)
length : Number
取得するデータの最大レコード数(0以上、0の場合、start以降の全件)
[params] : Array
SQL文に渡すパラメータの配列(DbParameter の配列)
返却値
DatabaseResult
DatabaseResult 参照系データベースアクセス結果オブジェクト。
DatabaseResult getByteReader (String tableName, String columnName, String condition, Array [params], Function [callback])
BLOB または InputStream を取得し、それを元に ByteReader を返します。
BLOB, CLOB 型は使用している DBMS に応じて以下をお使いください。
BLOB CLOB
Oracle BLOB CLOB
PostgreSQL bytea text
SQL Server image, varbinary(max) text, ntext, varchar(max), nvarchar(max)

 var storage = new PublicStorage('sample.txt');

 storage.createAsBinary(function(writer, error) { // PublicStorage に 3 バイトのデータ [97, 98, 99] をもつ sample.txt を作成します。
     if (error != null) {
         throw error;
     }

     writer.write([97, 98, 99]);
 });

 var db = new TenantDatabase();
 var result = db.execute('CREATE TABLE blob_example(blob BLOB)'); // BLOB 型のカラムを持つテーブルを作成します。BLOB に相当する型は各データベース製品で異なることに注意してください。

 if (result.error) {
     throw Error(result.errorMessage);
 }

 storage.openAsBinary(function(reader, error) { // blob へデータを追加します。
     if (error != null) {
         throw error;
     }

     result = db.execute('INSERT INTO blob_example VALUES(?)', [DbParameter.blob(reader)]);
     if (result.error) {
         throw Error(result.errorMessage);
     }
 });

 { // データ読み出し方法1(コールバックを指定する方法)
     db.getByteReader('blob_example', 'blob', '', null, function(result) { // blob からデータを読み取ります。この例のように getByteReader にコールバックを渡す場合ユーザはストリームを close する必要がありません。
         if (result.error) {
             throw Error(result.errorMessage);
         }

         var data = new Array(3);

         result.data.read(data);
         Debug.print(data);
     });
 }

 { // データ読み出し方法2(コールバックを指定しない方法)
     result = db.getByteReader('blob_example', 'blob', ''); // getByteReader にコールバックを渡さずにデータを読み取ります。この呼び出し方法ではユーザは戻り値を忘れずに close する必要があります。
     try {
         if (result.error) {
             throw Error(result.errorMessage);
         }

         var data = new Array(3);

         result.data.read(data);
         Debug.print(data);
     } finally {
         if (result.data != null) {
             result.data.close();
         }
     }
 }
 
パラメータ
tableName : String
対象テーブル名
columnName : String
String 列名
condition : String
検索条件(WHERE句)
where句 以降を設定してください。
[params] : Array
SQL文に渡すパラメータの配列(DbParameter の配列)
[callback] : Function
コールバック関数
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
データの中身については ByteReader を参照してください。
DatabaseResult getMetaData ()
データベースのメタデータを取得します。
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
データの中身については DatabaseMetaData を参照してください。
DatabaseResult getTextReader (String tableName, String columnName, String condition, Array [params], Function [callback])
CLOB または Reader を取得し、それを元に TextReader を返します。
BLOB, CLOB 型は使用している DBMS に応じて以下をお使いください。
BLOB CLOB
Oracle BLOB CLOB
PostgreSQL bytea text
SQL Server image, varbinary(max) text, ntext, varchar(max), nvarchar(max)

 var storage = new PublicStorage('sample.txt');

 storage.createAsText(function(writer, error) { // PublicStorage に 'sample text' という内容をもつ sample.txt を作成します。
     if (error != null) {
         throw error;
     }

     writer.write('sample text');
 });

 var db = new TenantDatabase();
 var result = db.execute('CREATE TABLE clob_example(clob CLOB)'); // CLOB 型のカラムを持つテーブルを作成します。CLOB に相当する型は各データベース製品で異なることに注意してください。

 if (result.error) {
     throw Error(result.errorMessage);
 }

 storage.openAsText(function(reader, error) { // clob へデータを追加します。
     if (error != null) {
         throw error;
     }

     result = db.execute('INSERT INTO clob_example VALUES(?)', [DbParameter.clob(reader)]);
     if (result.error) {
         throw Error(result.errorMessage);
     }
 });

 { // データ読み出し方法1(コールバックを指定する方法)
     db.getTextReader('clob_example', 'clob', '', null, function(result) { // clob からデータを読み取ります。この例のように getTextReader にコールバックを渡す場合ユーザはストリームを close する必要がありません。
         if (result.error) {
             throw Error(result.errorMessage);
         }

         Debug.print(result.data.readLine());
     });
 }

 { // データ読み出し方法2(コールバックを指定しない方法)
     result = db.getTextReader('clob_example', 'clob', ''); // getTextReader にコールバックを渡さずにデータを読み取ります。この呼び出し方法ではユーザは戻り値を忘れずに close する必要があります。
     try {
         if (result.error) {
             throw Error(result.errorMessage);
         }

         Debug.print(result.data.readLine());
     } finally {
         if (result.data != null) {
             result.data.close();
         }
     }
 }
 
パラメータ
tableName : String
対象テーブル名
columnName : String
String 列名
condition : String
検索条件(WHERE句)
where句 以降を設定してください。
[params] : Array
SQL文に渡すパラメータの配列(DbParameter の配列)
[callback] : Function
コールバック関数
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
データの中身については TextReader を参照してください。
DatabaseResult insert (String tableName, Object insertData)
指定されたテーブルにデータを挿入します。
対象テーブルからメタデータを取得し、テーブルとカラムの存在チェックが行われます。
指定されたプロパティ値は、対象カラムのJDBC型からAPI内部で自動的に対応するDbParameterに変換されます。
 new TenantDatabase().insert('test_table', {
     column1: 'test_value1',
     column2: 123,
     column3: textReader
 });
 
パラメータ
tableName : String
テーブル名
insertData : Object
挿入データ
カラム名をプロパティとして、設定する値をプロパティの値として指定してください。
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
Boolean isIncludeClobData ()
SQL実行時に、CLOB型のカラムに格納されているテキストデータの取得結果を変更するフラグを取得します。
このメソッドは intra-mart Accel Platform 2023 Autumn(8.0.34)(データベースアクセスモジュール(スクリプト開発向け)モジュールバージョン 8.0.16)から利用可能です。
返却値
Boolean
Boolean CLOB型のカラムに格納されているテキストデータをSQLで取得時の戻り値に含めない場合はfalse, SQLで取得時の戻り値に含める場合はtrue
Boolean isUseBigDecimal ()
decimal/numeric型のカラムの取得方法を変更するフラグを取得します。
このメソッドは intra-mart Accel Platform 2017 Winter(8.0.18)(データベースアクセスモジュール(スクリプト開発向け)モジュールバージョン 8.0.13)から利用可能です。
返却値
Boolean
Boolean Number型で取得する場合はfalse, BigDecimal型で取得する場合はtrue
DatabaseResult remove (String tableName, String condition, Array [params])
データベースデータを削除します。
パラメータ
tableName : String
対象テーブル名
condition : String
検索条件(WHERE句)
where句 以降を設定してください。
[params] : Array
SQL文に渡すパラメータの配列(DbParameter の配列)
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト
DatabaseResult select (String sql, Array [params], Number [length])
SELECT文を発行してデータを取得します。
パラメータ
sql : String
SELECT文
[params] : Array
SQL文に渡すパラメータの配列(DbParameter の配列)
[length] : Number
最大取得行数(0以上、0の場合は全件)
返却値
DatabaseResult
DatabaseResult 参照系データベースアクセス結果オブジェクト。
void setIncludeClobData (Boolean includeClobData)
SQL実行時に、CLOB型のカラムに格納されているテキストデータの取得結果を変更するフラグを設定します。
初期状態、またはTenantDatabase#setIncludeClobData(Boolean)でfalseを指定した場合は、SQLで取得時の戻り値に、CLOB型のカラムに格納されているテキストデータを含めずnullを返します。
TenantDatabase#setIncludeClobData(Boolean)でtrueを指定した場合は、SQLで取得時の戻り値に、CLOB型のカラムに格納されているテキストデータを含めて返します。
返却値に含めるため、テキストデータがメモリ上に展開されることになります。
そのため、大きなテキストデータを含むカラムが指定されていた場合に、OutOfMemoryError を引き起こす可能性があります。
true を指定する場合には、大きなテキストデータを含むカラムが返却されないように注意して利用する必要があります。
このメソッドは intra-mart Accel Platform 2023 Autumn(8.0.34)(データベースアクセスモジュール(スクリプト開発向け)モジュールバージョン 8.0.16)から利用可能です。
パラメータ
includeClobData : Boolean
CLOB型のカラムに格納されているテキストデータをSQL実行結果の戻り値に含めて返すか否か
返却値
void
void setUseBigDecimal (Boolean useBigDecimal)
decimal/numeric型のカラムの取得方法を変更するフラグを設定します。
数値型カラムの値を取得時のデータ型を変更します。
初期状態、またはTenantDatabase#setUseBigDecimal(Boolean)でfalseを指定した場合は、数値型カラムは Number型で取得します。
TenantDatabase#setUseBigDecimal(Boolean)でtrueを指定した場合は、数値型カラムは BigDecimal で取得します。
整数型、不動小数点型のカラムについては対応しておりません。
各JDBCにて対象のデータ型を表す java.sql.Typesの値が DECIMAL または NUMERIC である場合は、この設定によりBigDecimalにて数値情報を扱えます。
BigDecimalとして取得可能な型は以下の通りです。
  • Oracle Database: NUMBER
  • Microsoft SQL Server: decimal, numeric, money, smallmoney
  • PostgreSQL: decimal, numeric
このメソッドは intra-mart Accel Platform 2017 Spring(8.0.16)(データベースアクセスモジュール(スクリプト開発向け)モジュールバージョン 8.0.11)から利用可能です。
パラメータ
useBigDecimal : Boolean
decimal/numeric型を BigDecimalで取得するか否か
返却値
void
DatabaseResult update (String tableName, Object updateData, String condition, Array [params])
データベースのデータを更新します。
対象テーブルからメタデータを取得し、テーブルとカラムの存在チェックが行われます。
指定されたプロパティ値は、対象カラムのJDBC型からAPI内部で自動的に対応するDbParameterに変換されます。
 new TenantDatabase().update('test_table', {
     column1: 'test_value1',
     column2: 123,
     column3: textReader
 }, 'column4 LIKE ?', [DbParameter.string('%like%')]);
 
パラメータ
tableName : String
テーブル名
updateData : Object
更新データ
カラム名をプロパティとして、設定する値をプロパティの値として指定してください。
condition : String
検索条件(WHERE句)
where句 以降を設定してください。
[params] : Array
SQL文に渡すパラメータの配列(DbParameter の配列)
返却値
DatabaseResult
DatabaseResult データベースアクセス結果オブジェクト