从循环中定义的表名中进行选择



我有 2 个数据库连接:ab,它们共享相同的模式,但不一定是相同的数据。我需要使用循环检查每个表的两个数据库的总行数并比较它们的计数。 使用嵌套表集合,到目前为止我的尝试:

DECLARE  
TYPE nt_rows IS TABLE OF NUMBER;
nt_rows1 nt_num := nt_num();
nt_rows2 nt_num := nt_num();
counter INT := 0;
CURSOR c_tables1 IS 
SELECT TABLE_NAME
FROM ALL_TABLES
WHERE OWNER IN ('a')
ORDER BY TABLE_NAME ASC;
CURSOR c_tables2 IS
SELECT TABLE_NAME
FROM ALL_TABLES
WHERE OWNER IN ('b')
ORDER BY TABLE_NAME ASC;

BEGIN 块:遍历每个游标并将它们添加到每个数组中

BEGIN
FOR i IN c_tables1 LOOP  
nt_rows1.extend;
SELECT COUNT(*) FROM a.i.TABLE_NAME INTO nt_rows1(counter);
END LOOP;

最后一行不起作用,其中"a"是数据库连接名称,i 是每个table_name的索引。 我也试过:

nt_rows1(counter) := SELECT COUNT(*) FROM a.i.TABLE_NAME;

它也不起作用,任何建议都值得赞赏。

如果要从名称在字符串(例如局部变量或游标字段(中查询数据,因此在编译时未知,则需要使用动态SQL。

尝试更换线路

SELECT COUNT(*) FROM a.i.TABLE_NAME INTO nt_rows1(counter);

EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM a.' || i.TABLE_NAME INTO nt_rows1(counter);

另请注意,代码不会递增counter变量。 由于您从设置为0counter开始,并且0不是嵌套表中的有效索引,因此我建议在上面的行之前添加一行以递增counter

最新更新