使用变量作为子查询执行查询

时间:2019-05-22 09:01:45

标签: sql oracle plsql

我有这样的查询:

select * from SOURCE
where A = 'a'
and B in (
  select SOMECOLUMN from VERY_LONG_QUERY 
  WHERE SOMECHECK = 'some check'
)

我想将上述查询转换为PL / SQL语句,如下所示:


veryLongQueryVar := 'select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = ''some check'' ' 

select * from SOURCE
where A = 'a'
and B in veryLongQueryVar

怎么可能?

2 个答案:

答案 0 :(得分:0)

以下是您可以做什么的建议。

您将长查询中的值存储在一个集合中,并在另一个选择中使用它。

declare
  TYPE my_collection IS TABLE OF SOMECOLUMN%type
      INDEX BY number;
  tab my_collection ;
  rec SOURCE%rowtype;
begin
  select SOMECOLUMN 
  bulk collect into tab 
  from VERY_LONG_QUERY 
  WHERE SOMECHECK = 'some check';


  select * into rec 
    from SOURCE
   where A = 'a'
     and B in (select column_value from table(tab);
end; 

您还可以创建动态SQL字符串。

declare
  TYPE cur IS REF CURSOR;
  my_cur   cur;
  veryLongQueryVar  varchar2(32000);
begin
  veryLongQueryVar := 'select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = ''some check'' ' 

  veryLongQueryVar  := 'select * from SOURCE
                        where A = ''a''
                        and B in ('||veryLongQueryVar ||')'

  open my_cur for veryLongQueryVar  ;
  ....

end;

答案 1 :(得分:0)

您可以通过WITH clause实现类似的目标:

with veryLongQueryVar as
 (select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = 'some check')
select * from SOURCE
where A = 'a'
 and B in (select SOMECOLUMN from veryLongQueryVar)

您还可以使用SELECT INTO将非常长的查询结果选择为变量(某种类型的表)和use table to pass it into IN。但这将导致两个单独的查询,看来您想避免这种情况。