1

我创建了一个表“Meta_Data_Table_Names”,在其中在 MetaTableName 列中插入了 48 个表名。还有另一列提供行数和相应的表名。

我想从“Meta_Data_Table_Names”中获取表名,并通过 Loop 顺序执行 SELECT Query 以进行验证。每当我从 TOAD 执行时,它都会抛出一个错误:表或​​视图不存在。

我们是否需要为“Meta_name”制作一个可以扫描的占位符?或者在查询期间读取值的任何特定语法?

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;
4

2 回答 2

0

Oracle 不允许您使用动态表名进行查询,即如果表名在编译时未知。这样做,您需要Dynamic SQL,这有点过于宽泛,无法在这里介绍。

于 2013-11-07T01:26:14.637 回答
0

您的代码存在许多问题。

首先,我们不能在普通 SQL 中使用变量名:为此我们需要动态 SQL。例如:

 execute immediate 'select 1 from '|| Meta_Name || into n;

使用动态 SQL 时有很多微妙之处:PL/SQL 文档用一整章的篇幅介绍它。 了解更多

其次,在PL/SQL中执行SQL时,需要提供一个目标变量。这必须与执行查询的投影相匹配。选择整行时,%ROWTYPE关键字很有用。文档再次涵盖了这一点:了解更多。这导致 ...

第三,因为您正在使用动态 SQL,并且您事先不知道哪些表将在范围内,所以您不能轻松地声明目标变量。这意味着您需要使用引用游标和/或 Type 4 动态 SQL 技术。哎呀!在此处阅读 Adrian Billington 的出色博客文章

最后(我认为),查询中的 UNION ALL 不允许您识别从哪里丢失了哪些行。也许这无关紧要。

于 2013-11-07T07:20:15.103 回答