我正在尝试编写一个程序,我可以验证所有记录是否从源移动到目标,前提是该特定列之间没有涉及转换逻辑。我的方法是通过源列和目标列的计数来获取组,并匹配它们的计数。如果计数为0,那么该特定列的所有记录都与目标表匹配。
此外,按数量计算的2个数据组的减号将提供缺失的数据。
任何人都可以帮助我进一步解决这个问题。
存储过程:
create or replace
PROCEDURE MOVE_CHECK
(SCHEMA_SOURCE IN VARCHAR2,SCHEMA_TARGET IN VARCHAR2, TABLE_SOURCE IN VARCHAR2, TABLE_TARGET IN VARCHAR2, COLUMN_SOURCE IN VARCHAR2,
COLUMN_TARGET IN VARCHAR2)
AS
A varchar2 (30);
B varchar2 (30);
C varchar2 (30);
D varchar2 (30);
E varchar2 (30);
F varchar2 (30);
COUNT_SOURCE number(38);
TEMP_1 VARCHAR2(500);
TEMP_2 VARCHAR2(500);
TEMP_3 VARCHAR2(500);
TEMP_4 VARCHAR2(500);
COUNT_QUERY number(38);
BEGIN
A:=SCHEMA_SOURCE;
B:=SCHEMA_TARGET;
C:=TABLE_SOURCE;
D:=TABLE_TARGET;
E:=COLUMN_SOURCE;
F:=COLUMN_TARGET;
-- checking the count of the source records
TEMP_1 :='select count ( '|| E ||' ) from ' || C;
EXECUTE IMMEDIATE TEMP_1 INTO COUNT_SOURCE;
DBMS_OUTPUT.PUT_LINE ('source_count:'||Count_source);
TEMP_2 :='CREATE GLOBAL TEMPORARY TABLE SET_SOURCE AS (SELECT COUNT(1) AS COUNT_SOURCE, '|| E ||' from ' || C || ' GROUP BY ' || E||' )';
EXECUTE IMMEDIATE TEMP_2;
TEMP_3 :='CREATE GLOBAL TEMPORARY TABLE SET_TARGET AS (SELECT COUNT(1) AS COUNT_TARGET, ' || F||'FROM '||D||' GROUP BY ' ||D ||' )';
EXECUTE IMMEDIATE TEMP_3;
TEMP_4:= 'SELECT COUNT(1) FROM SET_SOURCE INTERSECT SET_TARGET ';
EXECUTE IMMEDIATE TEMP_4 INTO COUNT_QUERY;
DBMS_OUTPUT.PUT_LINE ('OUTPUT:'||COUNT_QUERY);
IF COUNT_QUERY <> 0
THEN DBMS_OUTPUT.PUT_LINE ('PLEASE CHECK');
ELSE DBMS_OUTPUT.PUT_LINE ('DONE- NO MISMATCH');
END IF;
END MOVE_CHECK;
我无法运行执行Temp_2,Temp_3,Temp_4
错误:
ORA-00955: name is already used by an existing object
ORA-06512: at "YDSCST.MOVE_CHECK", line 35
ORA-06512: at line 16
source_count:7
Process exited.
答案 0 :(得分:0)
如果您打印出动态SQL并尝试手动运行它通常会有帮助;它可以使语法错误更容易被发现。在这种情况下,如果您调用了DUAL
表的原始过程,您将看到:
CREATE GLOBAL TEMPORARY TABLE SET_SOURCE AS (SELECT COUNT(1), DUMMY )
from DUAL GROUP BY DUMMY )
如果你运行它,你会得到相同的ORA-00923,它表明问题可能在from
之前。在查看代码时,很明显列名后面有一个额外的右括号。但你发现自己已经发现了下一个错误。
之后的下一个错误应该是ORA-00998: must name this expression with a column alias
,因为您没有指定应该调用临时表的列。您可以在select
或create
:
TEMP_2 :='CREATE GLOBAL TEMPORARY TABLE SET_SOURCE (ROW_COUNT, COLUMN_NAME) '
|| 'AS (SELECT COUNT(1), ' || E || ' from ' || C || ' GROUP BY ' || E || ')';
但是您似乎已经找到并修复了自己,因为您现在正在获取ORA-06502,这是因为您的TEMP
变量小于您现在需要的查询字符串。但是你现在也自己解决了这个问题,将它们改为500个而不是100个。
您的TEMP_3
在from
之前缺少空格; F
的值当前直接连接到该值,使得该语句无效。 group by
正在使用D
(表名)而不是F
(列名)
TEMP_3 :='CREATE GLOBAL TEMPORARY TABLE SET_TARGET (ROW_COUNT, COLUMN_NAME) '
|| 'AS (SELECT COUNT(1), ' || F || ' FROM ' || D || ' GROUP BY ' || F ||' )';
如果您使用过程参数名称而不是无意义(和无意义)局部变量,那将更加明显。
在过程中创建全局临时表或任何结构通常不是一个好主意。你第二次打电话给他们,他们已经存在,这将是错误的。如果你真的需要它们,你应该在程序之外创建一个临时表作为一个单独的任务,并在程序中填充它们。