如何在 PL/SQL 中的内循环中引用外循环的变量?

问题描述 投票:0回答:0

我正在尝试引用使用 SELECT 语句创建的 FOR 循环中的值,作为该 FOR 循环内的 INSERT 语句中的参数。

更具体地说,我正在尝试使用该参数来组装 db_link 以从中提取数据。

如果我在其中硬编码 db_link,该代码块就可以工作,如下所示:

BEGIN
    FOR db IN
        (
        SELECT database_sid FROM STATS.DB_INFO
        WHERE ENV='P'
        )
    LOOP 
        INSERT INTO STATS.CPU_STATS
        SELECT db.database_sid, AVG_CPU_UTILIZATION
        FROM [email protected];
    END LOOP;
END; 

但是,我需要从其他几个数据库收集数据(是的,所有这些数据库都已经存在 db_link),因此在这里硬编码单个 db_link(ORCL.world)对我来说不起作用。我需要循环遍历动态创建的列表。

所以,我需要更多类似这样的东西,但它失败了:

BEGIN
    FOR db IN
        (
        SELECT database_sid FROM STATS.DB_INFO
        WHERE ENV='P'
        )
    LOOP 
        INSERT INTO STATS.CPU_STATS
        SELECT db.database_sid, AVG_CPU_UTILIZATION
        FROM [email protected]_sid.world;
    END LOOP;
END; 

注意: STATS 是我正在将这些信息收集到的本地数据库中的一个模式。我需要将数据从其他几个数据库动态提取到这个本地数据库中。


我已经尝试了引用 db_link 的 FROM 子句的不同变体,但到目前为止,所有变体都失败了。

FROM [email protected]_sid

FROM [email protected]_sid.world

FROM [email protected]_sid||'.world'

...以及上述的各种其他组合。

我还尝试将字符串构造为变量。

v_dblink := db.TARGET_SID||'.world';
...
FROM GV$RSRCMGRMETRIC_HISTORY@v_dblink

但这也失败了。

这看起来应该很简单,就像我只需要一个转义字符或其他东西,但到目前为止我尝试过的都没有成功执行。

我在 StackOverflow 上看到的大多数示例只是将变量的 dbms_ouput 从第一个循环转储到该内部循环的屏幕上。效果很好,但不是我在这里想要的。我需要主动使用这些变量来构造内部循环语句。

oracle loops plsql sql-insert
© www.soinside.com 2019 - 2024. All rights reserved.