intra-mart Accel Platform / Script研制模式编程指南

«  如何使用用户的时区、日期时间形式   ::   Contents   ::   日志  »

数据库

数据库的种类

intra-mart Accel Platform 中使用了下述3种数据库。
  • 系统数据库

    用于保存系统数据的数据库。
    系统数据库供系统内部使用,请用户不要使用系统数据库。
  • Tenant数据库

    用于保存 Tenant 内使用数据的数据库。
  • 共享数据库

    用于保存 intra-mart Accel Platform 系统以外数据的数据库。
    希望与外部系统联动时,请使用此数据库。

编程方法

事务

在此介绍事务处理的实现方法。
通过将Transaction对象的begin方法传递给执行函数,
事务处理结束时自动执行提交处理。
// 事务处理
Transaction.begin(function() {
    // 执行查询
    var result = new TeanantDatabase().execute(sql, param);
    if(result.error) {
        // 发生错误时,执行回滚处理。
        Transaction.rollback();
    }
});
如上所述,通过传递执行函数,处理正常结束时自动执行提交处理,
发生异常时自动执行回滚处理,因此能够防止事务
漏掉执行提交/回滚操作。

执行查询

查询处理的执行方法,因所连接数据库的种类而异。
  • Tenant数据库

    // 对Tenant数据库执行查询。
    var database = new TenantDatabase();
    var result = database.execute("select * from b_m_account_b");
    
  • 共享数据库

    // 对连接ID“sample”中设置的共享数据库执行查询。
    var database = new SharedDatabase("sample");
    var result = database.execute("select * from b_m_account_b");
    
利用prepared statement时,使用DbParameter对象。
// 利用 prepared statement ,执行查询。
var sql = "select * from b_m_account_b where user_cd = ? and login_failure_count = ?";
var result = new TenantDatabase().execute(sql, {
    DbParameter.string("aoyagi"),
    DbParameter.number(0)
});

外部SQL的应用

外部SQL是指,将SQL语句设置在程序外部,通过程序执行该SQL语句的功能。
使用外部SQL时,请在扩展名为“.sql”的文本文件中编写SQL,
并将其配置在“<CONTEXT_PATH>/WEB-INF/jssp/src”下任意目录中。
使用“<CONTEXT_PATH>/WEB-INF/jssp/src/sample/sql/get_sample_data.sql”的SQL文件时,可通过以下方式实现。
// 利用外部SQL语句,执行查询处理。
var database = new TenantDatabase();
var result = database.executeByTemplate('sample/sql/get_sample_data', params);

被读取的文件

使用外部SQL时,可以按所连接数据库种别对SQL文件进行区分。

要按数据库种别区分SQL文件时,可在文件名后添加相应数据库种别作为后缀。
  • 例如:数据库种别为Oracle,SQL文件名为“get_sample_data.sql”时,
    • 要把SQL文件名改为“get_sample_data_oracle.sql”。
如上所述,若提供带有后缀的SQL文件,则当数据库种别为Oracle时,
将执行“get_sample_data_oracle.sql”文件,为其他数据库时则执行“get_sample_data.sql”文件。
对SQL文件名添加的各种数据库后缀如下所示。
数据库 后缀
Oracle _oracle
SQLServer _sqlserver
DB2 _db2
PostgreSQL _postgre

SQL文件编写示例

  • 例1 2Way-SQL的应用

    所谓2Way-SQL,是指通过用注释编写与程序之间的映射,
    也可以直接执行SQL*Plus等SQL工具的SQL语句。
    • SQL文件“sample.sql”
    SELECT *
    FROM b_m_account_b
    WHERE user_cd = /*userCd*/'aoyagi'
    
    • 程序“sample.js”
    new TenantDatabase().executeByTemplate('sample', {
        userCd : DbParameter.string("harada")
    });
    
    执行程序后,将取得 user_cd=’harada’ 的数据。
    若通过工具直接执行 “sample.sql” 文件,则将取得 user_cd=’aoyagi’ 的数据。
    执行程序时,将把WHERE语句的注释部分替换为 prepared statement。
    若在SQL文件的注释部分(/参数名/)添加“:数据类型”,则不必用 DbParameter,
    也可以使用 prepared statement。
    • SQL文件“sample.sql”
    SELECT *
    FROM b_m_account_b
    WHERE user_cd = /*userCd:string*/'aoyagi'
    
    • 程序“sample.js”
    new TenantDatabase().executeByTemplate('sample', {
        userCd : "harada"
    });
    
  • 例2 prepared statement的应用

    在 SQL 文件中编写prepared statement (包含?的SQL语句)时,将按出现顺序将在参数中指定属性名为
    $1, $2, …, $N的对象。
    • SQL文件“sample.sql”
    SELECT *
    FROM b_m_account_b
    WHERE user_cd = ? AND login_failure_count = ?
    
    • 程序“sample.js”
    new TenantDatabase().executeByTemplate('sample', {
        $1 : DbParameter.string('aoyagi'),
        $2 : DbParameter.number(0)
    });
    
  • 例3 字符串的替换

    希望动态替换在 SQL 文件中编写的查询字符串后执行 SQL 语句时,可在注释中添加
    “$”以指定参数名。
    • SQL文件“sample.sql”
    SELECT *
    FROM b_m_account_b
    ORDER BY /*$order*/'user_cd'
    
    • 程序“sample.js”
    new TenantDatabase().executeByTemplate('sample', {
        order : "user_cd"
    });
    
    可以使用于如ORDER BY语句一样,希望替换无法使用 prepared statement 的部分字符串的场合。
  • 例4 条件分支

    希望动态变更按特定条件执行的SQL语句时,使用/IF/ /END/。
    • SQL文件“sample.sql”
    SELECT *
    FROM b_m_account_b
    WHERE
        /*IF userCd != null*/
        user_cd LIKE /*userCd:string*/'aoyagi'
        /*END*/
        /*IF predicate()*/
        AND login_failure_count = /*failureCount:number*/0
        /*END*/
    
    • 程序“sample.js”
    new TenantDatabase().executeByTemplate('sample', {
        userCd : "harada",
        failureCount : 0,
        predicate : function() {
            return true;
        }
    });
    
    由于条件分支WHERE语句会变成空白等,可能执行错误的SQL语句时,
    需要用/BEGIN/ /END/将WHERE语句括起来。
    使用/BEGIN/ /END/后,将进行以下处理,由此防止执行错误的SQL语句。
    1. 所有条件均不成立时,将从SQL语句中删除WHERE。
    2. 最初成立条件的检索字符串以AND开始时,将删除AND。
    • SQL文件“sample.sql”
    SELECT *
    FROM b_m_account_b
    /*BEGIN*/
    WHERE
        /*IF userCd != null*/
        user_cd LIKE /*userCd:string*/'aoyagi'
        /*END*/
        /*IF predicate()*/
        AND login_failure_count = /*failureCount:number*/0
        /*END*/
    /*END*/
    

«  如何使用用户的时区、日期时间形式   ::   Contents   ::   日志  »