如何使用包含表名的声明变量作为for循环中的联接。 Oracle PL / SQL

时间:2019-05-29 09:29:35

标签: oracle plsql

我想在存储过程中用作某些SQL一部分的物化视图的名称保存在一个表中。我需要获取存储在变量中的表的名称,以便该过程可以使用它。将接收表名称的部分位于for循环中。如何在循环中使用变量?

这是我的意思的示例:

declare
l_dblink varchar2(100) := 'DB1';
V_MV_NAME varchar2(2000);

begin

SELECT mv_name into V_MV_NAME 
FROM track_mv
WHERE
CREATED_AT = (select MAX(CREATED_AT) from track_mv);

for rws in (

  select /*+parallel (4)*/ a.owner,a.table_name, round(sum(b.sum_bytes),2)  TOT_OBJECT_SIZE_MB, EST_ONE_ROW_MB
    from dba_tables@DB1 a, MAT_VIEW_ANON b
    where a.table_name = b.segment_name

and a.table_name in
(select table_name from BOB_TABLE where driver_table is null)
and a.owner in (select distinct schema from BOB_TABLE c)
group by a.owner,a.table_name
order by a.table_name
)
loop...

此处,V_MV_NAME包含变量。我想在查询正文中使用该变量:

for rws in (

  select /*+parallel (4)*/ a.owner,a.table_name, round(sum(b.sum_bytes),2)  TOT_OBJECT_SIZE_MB, EST_ONE_ROW_MB
    from dba_tables@DB1 a, MAT_VIEW_ANON b
    where a.table_name = b.segment_name

因此它可能会显示以下内容:

from dba_tables@DB1 a, ||V_MV_NAME|| 'b'

或类似。该代码已经具有硬编码值。如果可能的话,这将是最简单的事情?

1 个答案:

答案 0 :(得分:0)

  

我想在存储过程中用作某些SQL一部分的物化视图的名称保存在表中

这是一个坏主意。它不会扩展,您必须将代码切换到动态SQL,这很难看而且很难维护。对于简单的情况,这是...啊,好的,可以接受,但是对于您这样的东西-嗯,我不想这样做。

我建议您找到另一种方法。

无论如何,为什么要这样做?按原样使用实例化视图名称​​ ,而不存储在某些表中。