我最近遇到了几个值,这些值在我们的应用程序中引起异常。查看数据库后发现,我们可能导入了错误的数据(不得修改!)。现在,我们发现此错误的原因在于unicode问题。
为了找到所有相关的错误记录,我转储了已经(手动)识别的值,可以看到有问题的值在值96之上,下面是一个示例:
Typ=96 Len=10: 83,85,49,89,36,73,219,190,159,87
而219,190,159是有问题的。这可以通过select dump(col) from table
获得,但是我只想进一步选择转储中的值之一超过99的记录-非常像(pseudo code)length(string(value)) for value in dump_record > 96
做到这一点的方法?谢谢大家。
这就是我对问题的理解。看看是否有帮助;遵循代码中的注释:
SQL> with
2 data (col) as
3 -- sample data:
4 -- 123LITTlefOOT results in Typ=96 Len=13: 49,50,51,76,73,84,84,108,101,102,79,79,84
5 -- where marked values are > 96 --- --- ---
6 --
7 -- BIG997FOOT results in Typ=96 Len=10: 66,73,71,57,57,55,70,79,79,84 which is OK
8 (select '123LITTlefOOT' from dual union all
9 select 'BIG997FOOT' from dual
10 ),
11 test as
12 -- DUMP of sample data
13 (select col,
14 dump(col) dmp
15 from data
16 ),
17 -- remove TYP=XX Len=yy
18 test2 as
19 (select col,
20 dmp,
21 trim(substr(dmp, instr(dmp, ':') + 1)) tdmp
22 from test
23 ),
24 -- split TDMP into rows
25 trows as
26 (select col,
27 dmp,
28 regexp_substr(tdmp, '[^,]+', 1, column_value) str
29 from test2 cross join table(cast(multiset(select level from dual
30 connect by level <= regexp_count(tdmp, ',') + 1
31 ) as sys.odcinumberlist))
32 )
33 select distinct col, dmp
34 from trows
35 where to_number(str) > 96;
COL DMP
------------- ------------------------------------------------------------
123LITTlefOOT Typ=1 Len=13: 49,50,51,76,73,84,84,108,101,102,79,79,84
SQL>