我有一个很长的存储过程。很多时候,在存储过程中,重复下面的子查询(在括号中)。
and datasetid IN
(select datasetid from Reportingdatasetmembers
where ReportingDatasetID = param_in_ReportingDataSetID)
我可以整合该代码,因为它会被重复吗?即,在SQL Server中,我将声明一个表变量。然后将行插入表变量。然后查询表变量。至少,这有助于应用DRY原则。
在Oracle中是否有相同的方法来整合它? Oracle表集合似乎并没有减少代码库。
我认为CTE是不可能的,因为它们无法重复使用?
答案 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 没试过,但看过几次工作