我正在尝试引用使用 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 从第一个循环转储到该内部循环的屏幕上。效果很好,但不是我在这里想要的。我需要主动使用这些变量来构造内部循环语句。