使用存储过程的Datawarehousing Automation

时间:2014-06-17 13:32:29

标签: sql oracle stored-procedures

我正在尝试编写一个程序,我可以验证所有记录是否从源移动到目标,前提是该特定列之间没有涉及转换逻辑。我的方法是通过源列和目标列的计数来获取组,并匹配它们的计数。如果计数为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.

1 个答案:

答案 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,因为您没有指定应该调用临时表的列。您可以在selectcreate

中执行此操作
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_3from之前缺少空格; 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 ||' )';

如果您使用过程参数名称而不是无意义(和无意义)局部变量,那将更加明显。

在过程中创建全局临时表或任何结构通常不是一个好主意。你第二次打电话给他们,他们已经存在,这将是错误的。如果你真的需要它们,你应该在程序之外创建一个临时表作为一个单独的任务,并在程序中填充它们。