Sql 使用存储过程实现数据仓库自动化

Sql 使用存储过程实现数据仓库自动化,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,我正在尝试编写一个过程,在这个过程中,我可以验证所有记录是否从源移动到目标,前提是该特定列之间不涉及转换逻辑。我的方法是按源列和目标列的计数进行分组,并匹配它们的计数。如果计数为0,则该特定列的所有记录都与目标表匹配 此外,按计数从2数据组中减去将提供缺少的数据 有人能帮我进一步吗 存储过程: create or replace PROCEDURE MOVE_CHECK (SCHEMA_SOURCE IN VARCHAR2,SCHEMA_TARGET IN VARCHAR2, TABLE

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

如果您打印出动态SQL并尝试手动运行它,通常会有所帮助;它可以使语法错误更容易发现。在这种情况下,如果调用
DUAL
表的原始过程,您将看到:

CREATE GLOBAL TEMPORARY TABLE SET_SOURCE AS (SELECT COUNT(1), DUMMY )
from DUAL GROUP BY DUMMY )
如果运行该程序,您将得到相同的ORA-00923,它表明问题可能在中的
之前。看看代码,很明显在列名后面有一个额外的右括号。但是你自己发现了,现在又犯了下一个错误

之后的下一个错误应该是
ORA-00998:必须使用列别名命名此表达式,因为您尚未指定应调用临时表的列。您可以在
选择
创建
中执行此操作:

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
的值当前直接连接到该值,这使得该语句无效。而
groupby
使用的是
D
(表名)而不是
F
(列名)

如果您使用的是过程参数名称,而不是无意义(和无意义)的局部变量,那么这一点就更加明显了


在过程中创建全局临时表或任何结构通常不是一个好主意。第二次调用时,它们将已经存在,并且会出错。如果您真的需要临时表,那么您应该在过程之外创建临时表作为一个单独的任务,然后在过程内部填充它们。

好的,您不认为显示错误消息会有所帮助吗?这些执行的前两个错误是非常自明的。无论如何,在过程中创建GTT不是一个好主意,您应该将它作为一个单独的任务创建一次,然后在过程中填充它。在修复错误并继续下一个问题时,您似乎正在更新问题,这很烦人;但不一定要使代码和错误保持一致。此时,您似乎已经修复了代码中的ORA-6502,但仍然显示该错误。我不知道您是否仍然收到错误,例如来自
F | |'。看起来你能解决所有这些问题,这很好,但我不知道你为什么要在这里问这些问题,真的。谢谢普尔。我会照你的建议去做。实际上,我正在学习存储过程,同时我还必须完成一项作业。
TEMP_2 :='CREATE GLOBAL TEMPORARY TABLE SET_SOURCE (ROW_COUNT, COLUMN_NAME) '
  || 'AS (SELECT COUNT(1), ' || E || ' from ' || C || ' GROUP BY ' || E || ')';
TEMP_3 :='CREATE GLOBAL TEMPORARY TABLE SET_TARGET (ROW_COUNT, COLUMN_NAME) '
  || 'AS (SELECT COUNT(1), ' || F || ' FROM ' || D || ' GROUP BY ' || F ||' )';