使用CURSOR从另一个表中获取多个表名

时间:2013-11-06 22:50:31

标签: sql oracle plsql

我创建了一个表“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;

2 个答案:

答案 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不允许您识别哪些行丢失在哪里。也许这没关系。