我有一个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将值分配给第一个查询,然后是下一个查询。
谢谢。