首页 > 解决方案 > 使用变量作为子查询执行查询

问题描述

我有一个这样的查询:

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

怎么可能?

标签: sqloracleplsql

解决方案


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

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

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;

推荐阅读