Oracle 检查 表记录中是否有乱码的 存储过程

2014-11-24 13:04:18 · 作者: · 浏览: 1

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。