ADF ViewObject:链接的绑定变量

时间:2018-08-22 23:35:59

标签: java oracle oracle-adf jdeveloper bind-variables

我有一个ViewObject“ ActiveRecordsVO”,其结构如下:

SELECT R.NAME, 
       R.SOURCE, 
       R.AMOUNT
  FROM RECORDS R
 WHERE R.EXPIRED = 'N'
   AND R.ID IN (SELECT * 
                  FROM TABLE (CAST(:bindRecordsArr AS NUMBER)))

由于VO要求的变化,我需要以一种允许我拥有两个不同子查询的方式来“绑定”绑定变量:

AND R.ID IN (SELECT * 
               FROM TABLE (CAST(:bindRecordsArr AS NUMBER)))

和一个新的子查询,该子查询从也具有自己的绑定变量的外部API获取ID:

AND R.ID IN (SELECT IDKEY 
               FROM TASKS 
              WHERE ...<where clauses> 
                AND :bindIDKeys IS NULL)

要使用的子查询将由用户配置值确定。 最初,我想到在VO中使用新的绑定变量“ bindRecordsSubQuery”,并具有以下VO查询:

SELECT R.NAME, 
       R.SOURCE, 
       R.AMOUNT
  FROM RECORDS R
  WHERE R.EXPIRED = 'N'
        :bindRecordsSubQuery

然后,使用VOImpl方法prepareRowSetForQuery来相应地设置bindRecordsSubQuery。

prepareRowSetForQuery(ViewRowSetImpl vrs) {
    if (useNewSubQuery) {
      String recSubQuery = "AND R.ID IN (SELECT IDKEY FROM TASKS WHERE ...<where clauses> AND :bindIDKeys IS NULL)";
      vrs.ensureVariableManager().setVariableValue("bindRecordsSubQuery", recSubQuery);
      vrs.ensureVariableManager().setVariableValue("bindIDKeys", null);
    } else {
      String recSubQuery = "AND R.ID IN (SELECT * FROM TABLE (CAST(:bindRecordsArr AS NUMBER)))";
      Object [] recordsArr = someMethod();
      vrs.ensureVariableManager().setVariableValue("bindRecordsSubQuery", recSubQuery);
      vrs.ensureVariableManager().setVariableValue("bindRecordsArr", recordsArr);
    }
}

但是,这种“链接”绑定变量的方法不起作用,因为我总是得到空结果,而当使用原始子查询时,我确实得到了结果。 有没有办法做到这一点?还是这超出了绑定变量的能力?主要挑战是要拥有一个初始绑定变量,该变量将包含另一个带有绑定变量的查询,然后使用setVariableValue将值分配给第一个查询,然后是下一个查询。

谢谢。

0 个答案:

没有答案