Search code examples
repositoryatgoracle-commerce

ATG - How to override RQL for insert statements


I need to insert records to an Oracle DB table that already has records in it by using the table's sequence.

I tried using RQL which creates an auto-generated id for the primary key but sometimes those generated ids already exist in the database and as a result, a constraint violation error is thrown.

ATG documentation provides an alternative named Overriding RQL-Generated SQL but I didn't manage to make it work for insert statements.

GSARepository repo =
   (GSARepository)request.resolveName("/examples/TestRepository");
RepositoryView view = repo.getView("canard");
Object params[] = new Object[4];
  params[0] = new Integer (25);
  params[1] = new Integer (75);
  params[2] = "french";
  params[3] = "greek";
Builder builder = (Builder)view.getQueryBuilder();
String str = "SELECT * FROM usr_tbl WHERE (age_col > 0 AND age_col < 1
AND EXISTS (SELECT * from subjects_tbl where id = usr_tbl.id AND subject
IN (2, 3)))";

RepositoryItem[] items =
    view.executeQuery (builder.createSqlPassthroughQuery(str, params));

Is there any way to use table's sequence for insert statements via ATG Repository API?


Solution

  • Eventually, I did not manage to make it work but I found the following solution.

    I retrieved the sequence number as below and then used it in the RQL insert statement.

    RepositoryView view = getRestServiceDetailsRepository().getView("wsLog");
    String sql = "select log_seq.nextval from dual";
    
    Object[] params = {};
    Builder builder = (Builder) view.getQueryBuilder();
    Query query = builder.createSqlPassthroughQuery(sql, params);
    RepositoryItem[] items = view.executeQuery(query);
    if (items != null && items.length > 0) {
        items[0].getRepositoryId();
    }