【发布时间】: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。分享和享受。