我创建了一个表“Meta_Data_Table_Names”,我在MetaTableName列中插入了四十八个表名。还有另一列提供具有相应表名的行计数。
我想从“Meta_Data_Table_Names”中获取表名,然后通过Loop顺序执行SELECT Query以进行验证。 每当我从TOAD执行时,它都会抛出一个错误: 表或视图不存在。
我们是否需要为'Meta_name'制作可以扫描的占位符?或者在Query期间读取值的任何特定语法?
DECLARE
CURSOR c1 IS SELECT MetaTableName FROM Meta_Data_Table_Names;
CURSOR c2 IS SELECT ROW_COUNT FROM Meta_Data_Table_Names;
Meta_name Meta_Data_Table_Names.MetaTableName%TYPE;
Count_num Meta_Data_Table_Names.ROW_COUNT%TYPE;
BEGIN
OPEN c1;
OPEN c2;
FOR i IN 1..48 LOOP
FETCH c1 INTO Meta_name;
FETCH c2 INTO Count_num;
IF (Count_num > 2000)
THEN
SELECT * FROM Meta_Name X
MINUS
SELECT * from ASFNCWK07.Meta_Name@NCDV.US.ORACLE.COM Y
UNION ALL
SELECT * FROM ASFNCWK07.Meta_Name@NCDV.US.ORACLE.COM Y
MINUS
SELECT * FROM Meta_Name X;
ELSE
DBMS_OUTPUT.PUT_LINE ('No Validation is required');
END IF;
END LOOP;
END;
答案 0 :(得分:0)
Oracle不允许您使用动态表名进行查询,即如果在编译时未知表名。这样做,你需要Dynamic SQL,这有点过于宽泛,不能进入这里。
答案 1 :(得分:0)
您的代码存在许多问题。
首先,我们不能在普通SQL中使用变量名:为此,我们需要动态SQL。例如:
execute immediate 'select 1 from '|| Meta_Name || into n;
使用动态SQL时有许多细微之处:PL / SQL文档专门用了一章。 Find out more
其次,在PL / SQL中执行SQL时,我们需要提供一个目标变量。这必须与执行的查询的投影相匹配。选择整行时,%ROWTYPE
关键字很有用。文档再次涵盖了这一点:find out more。这导致......
第三,因为您正在使用动态SQL并且您事先并不知道哪些表将在范围内,所以您无法轻松声明目标变量。这意味着您将需要使用ref游标和/或Type 4动态SQL技术。哎呀!阅读Adrian Billington的excellent blog article here。
最后(我认为),查询中的UNION ALL不允许您识别哪些行丢失在哪里。也许这没关系。