用户定义的psuedocolumn oracle

时间:2012-11-21 18:27:11

标签: sql oracle

我在oracle数据库中有一个大型数据集,目前一次只能从Java访问一个项目。例如,如果用户试图批量获取50个项目,它将按顺序处理它们,为每个项目调用存储过程。我现在正在尝试实现批量获取,但由于用户可以传递范围查询的方式,我遇到了一些困难:

示例表:

prim_key  |  identifier  |  start  |  end
----------+--------------+---------+-------
1         |  aaa         |  1      |  3
2         |  aaa         |  3      |  7
3         |  bbb         |  1      |  5

它的工作方式是,如果您有(id='aaa' and pos=1)之类的查询,它会找到prim_key = 1,但如果您查询(id='aaa' and pos=2),它将找不到任何内容。如果你执行(id='aaa' and pos=-2),那么它将再次找到prim_key = 1,因为存储过程将-2转换为等同于start<=2end>2的范围扫描。

(额外的上下文:开始/结束实际上是日期,这个查询机制允许有效的“最新截至日期”查询,而不是像选择prim_key,

start from myTable 
where start = (select max(start) from myTable where start <= 2))

这一切都很好并且对于单个获取正常工作,但现在我正在尝试批量获取,以便我们可以大大加快批次。第一次尝试是对多个调用进行多线程处理,但它对数据库施加了太多压力,要求在同一个表上进行如此多的并行查询。为了解决这个问题,我一直在尝试创建像

这样的查询
select prim_key 
from myTable 
where (identifier='aaa' and start=3) 
or (identifier='aaa' and start<=2 and end>2)

从输入参数列表('aaa',3 ; 'bbb',-2)构建它,它运行良好并使用我期望的所有索引生成解释计划。

我的问题:我需要知道检索该行的输入参数是什么,以便进行进一步处理并返回相关的prim_key。我需要使用类似psuedocolumn的东西,我可以自己定义:

select prim_key, PSUEDO 
from myTable 
where (identifier='aaa' and start=3 and PSUEDO='a3') 
or (identifier='aaa' and start<=2 and end>2 and PSUEDO='a-2')

但我找不到任何方法从where子句返回一个值,我认为子查询会失去通过在一个select中完成所有操作而获得的索引效率。

1 个答案:

答案 0 :(得分:0)

尝试类似:

select
 prim_key,
 case when start = 3 then 'a3' else 'a-2' end pseudo
from
 you_table
where
 ...