HelloJin 同学说他们的OGG 同步的数据可能有乱码,要整个方法检测一下。 讨论了半天,没有找到什么好方法,只能每个表,每条记录的去做查询,然后进行比较。
判断的过程如下:
view plain
/* Formatted on 2011/10/11 10:45:33 (QP5 v5.163.1008.3004) */
CREATE OR REPLACE PROCEDURE lank_test (pv_tbname IN VARCHAR2,
pv_owner IN VARCHAR2)
IS
num NUMBER;
p_flag NUMBER;
p_flag2 NUMBER;
p_col VARCHAR2 (30);
p_str VARCHAR2 (1000);
p_tbname VARCHAR2 (30);
p_owner VARCHAR2 (30);
BEGIN
p_tbname := pv_tbname;
p_owner := pv_owner;
-- p_tbname:='LANK_F1';
-- p_owner:='SYS';
--dbms_output.put_line(p_tbname||p_owner);
SELECT COUNT (*)
INTO p_flag
FROM dba_tab_columns
WHERE table_name = p_tbname AND owner = p_owner;
-- dbms_output.put_line('Total:'||p_flag);
WHILE p_flag > 0
LOOP
SELECT column_name
INTO p_col
FROM dba_tab_columns
WHERE table_name = p_tbname AND COLUMN_ID = p_flag AND owner = p_owner;
-- dbms_output.put_line(p_str);
EXECUTE IMMEDIATE
'select count(*) from '
|| p_owner
|| '.'
|| p_tbname
|| ' where asciistr('
|| p_col
|| ') like ''% %'' or asciistr('
|| p_col
|| ') like ''%\FFFD%'' '
INTO p_flag2;
IF p_flag2 > 0
THEN
DBMS_OUTPUT.put_line (
p_owner || '.' || p_tbname || ' Have:' || p_flag || ',' || p_col);
INSERT INTO resout
VALUES (p_owner,
p_tbname,
p_flag,
p_col);
COMMIT;
END IF;
--init
p_flag2 := 0;
p_flag := p_flag - 1;
END LOOP;
INSERT INTO table_temp
VALUES (p_owner, p_tbname);
COMMIT;
END lank_test;
该存储过程由HelloJin同学编写,感谢他的辛勤劳动。
这里的核心语句是:
'selectcount(*) from '
|| p_owner
|| '.'
||p_tbname
|| ' whereasciistr('
|| p_col
|| ') like''% %'' or asciistr('
|| p_col
|| ') like''%\FFFD%'' '
本想使用并行查询来提高效率的,因为表大的话,效率会很低,但因为没有使用分区表,使用并行效果不明显。
Oracle Parallel Execution(并行执行):http://www.2cto.com/database/201110/107273.html
如果其他同学有更好的方法来判断,不妨留个言或者给我email。