如何重用子查询

时间:2016-10-18 16:02:08

标签: oracle oracle11g subquery

我有一个很长的存储过程。很多时候,在存储过程中,重复下面的子查询(在括号中)。

and datasetid IN 
  (select datasetid from Reportingdatasetmembers
    where  ReportingDatasetID = param_in_ReportingDataSetID)

我可以整合该代码,因为它会被重复吗?即,在SQL Server中,我将声明一个表变量。然后将行插入表变量。然后查询表变量。至少,这有助于应用DRY原则。

在Oracle中是否有相同的方法来整合它? Oracle表集合似乎并没有减少代码库。

我认为CTE是不可能的,因为它们无法重复使用?

4 个答案:

答案 0 :(得分:3)

Subquery factoring(在其他数据库平台中也称为CTE)就是您所需要的,例如:

with dataset as (select datasetid
                 from   Reportingdatasetmembers
                 where  ReportingDatasetID = param_in_ReportingDataSetID)
select ...
from   some_table_1
where  ...
and    datasetid in (select datasetid from dataset)
union all
select ...
from   some_table_2
where  ...
and    datasetid in (select datasetid from dataset);

答案 1 :(得分:0)

在Oracle中,你真的和SQL Server一样。声明一个类型的变量,该类型是已定义记录的表。类似的东西:

type my_rec_type is record (v_datasetid number(20))
type my_table_type is table of my_rec_type index by pls_integer;
my_table_var my_table_type;

...定义光标的参数

v_paramReportingDataSetID number(20);

...在代码中,您将其设置为特定ID

v_paramReportingDataSetID:= 12345;

...将光标与语句

一起使用
open my_cursor for (select datasetid from Reportingdatasetmembers
    where  ReportingDatasetID = :v_paramReportingDataSetID);

...从光标

填充表变量
fetch my_cursor bulk collect into my_table_var;

...现在表/数组/数据位于my_table_var变量中,可用于其余代码。

答案 2 :(得分:0)

@Boneist的方法是正确的,但我认为你应该在选择中添加具体化提示。所以它来得更快。

with dataset as (select  /*+ materialize */
                        datasetid
                 from   Reportingdatasetmembers
                 where  ReportingDatasetID = param_in_ReportingDataSetID)
select ...
from   some_table_1
where  ...
and    datasetid in (select datasetid from dataset)
union all
select ...
from   some_table_2
where  ...
and    datasetid in (select datasetid from dataset);

答案 3 :(得分:-1)

创建变量v_query long; 和 然后宣布 v_query:='(从Reportingdatasetmembers中选择datasetid     其中ReportingDatasetID ='param_in_ReportingDataSetID')'

而不是调用v_query 没试过,但看过几次工作