【问题标题】:Using CURSOR to fetch multiple table names from another table使用 CURSOR 从另一个表中获取多个表名
【发布时间】:2013-11-18 17:39:25
【问题描述】:

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

【问题讨论】:

  • 在 SELECT 语句中,您打算使用“Meta_Name”是什么意思?在 DECLARE 部分中,它被声明为 Meta_Data_Table_Names.MetaTableName%TYPE 类型的变量,您不能从中选择。 “Meta_Name”也是表的名称吗?如果是,我怀疑您必须使用模式名称对其进行限定才能正确定位它。
  • 感谢您的回复。 MetaTableName 是该表 Meta_Data_Table_Names 中存储所有表名的列。光标 C1 是为 MetaTableName 定义的,其中 Meta_name 是一个占位符。我用以下代码修改了代码,但现在显示不同的错误。我认为这个动态查询中的语法仍然不正确。
  • Cursor C2 应该是SELECT COUNT(*) FROM META_DATA_TABLE_NAMES,但我建议这不应该是一个游标——它只会返回一行并且你将尝试从中获取 48 次。我建议将此游标替换为直接调用SELECT COUNT(*) INTO COUNT_NUM FROM META_DATA_TABLE_NAMES。分享和享受。

标签: sql oracle plsql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的代码存在许多问题。

    首先,我们不能在普通 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,并且您事先不知道哪些表将在范围内,因此您无法轻松声明目标变量。这意味着您需要使用引用游标和/或 Type 4 动态 SQL 技术。哎呀!阅读 Adrian Billington 的 excellent blog article here

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多