2017-10-12 55 views
0

我目前正試圖找出一種方法來輸出包含任何西里爾(或非拉丁-1 )字母,不管他們在什麼列 我已經繼承了一個腳本,它使用遊標遍歷表和列,並通過使用unistr()的正則表達式來搜索西里爾文的跡象,但我無法弄清楚爲什麼似乎對我們的Oracle12分貝工作了它不PL/SQL:通過正則表達式查找所有西里爾(或非latin1)標誌

聲明如下:

 stmt := 'select ID from '||table_name || ' where regexp_LIKE('||table_name||'.'||column_name||','||stmt_template|| ')'; 

表名和列名應selft EXP lanatory,stmt_template是一個早期定義的模板,包含我的問題。 「語句」的用法如下(及工程):

OPEN stmt_cursor for stmt; 
    LOOP [some code] 

的stmt_template定義如下,並始終引發我一個錯誤 stmt_template VARCHAR(32767) := '^[''||unistr(''\20AC'')||unistr(''\1EF8'')||''-''||unistr(''\1EF9'')||unistr(''\1EF2'')||''-''||unistr(''\1EF3'')||unistr(''\1EE4'')||''-''||unistr(''\1EE5'')||unistr(''\1ED6'')||''-''||unistr(''\1ED7'')||unistr(''\1ECA'')||''-''||unistr(''\1ECF'')||unistr(''\1EC4'')||''-''||unistr(''\1EC5'')||unistr(''\1EBD'')||unistr(''\1EAA'')||''-''||unistr(''\1EAC'')||unistr(''\1EA0'')||''-''||unistr(''\1EA1'')||unistr(''\1E9E'')||unistr(''\1E9B'')||unistr(''\1E8C'')||''-''||unistr(''\1E93'')||unistr(''\1E80'')||''-''||unistr(''\1E85'')||unistr(''\1E6A'')||''-''||unistr(''\1E6B'')||unistr(''\1E60'')||''-''||unistr(''\1E63'')||unistr(''\1E56'')||''-''||unistr(''\1E57'')||unistr(''\1E44'')||''-''||unistr(''\1E45'')||unistr(''\1E40'')||''-''||unistr(''\1E41'')||unistr(''\1E30'')||''-''||unistr(''\1E31'')||unistr(''\1E24'')||''-''||unistr(''\1E27'')||unistr(''\1E1E'')||''-''||unistr(''\1E21'')||unistr(''\1E10'')||''-''||unistr(''\1E11'')||unistr(''\1E0A'')||''-''||unistr(''\1E0B'')||unistr(''\1E02'')||''-''||unistr(''\1E03'')||unistr(''\0292'')||unistr(''\0259'')||unistr(''\022A'')||''-''||unistr(''\0233'')||unistr(''\01FA'')||''-''||unistr(''\021F'')||unistr(''\01F7'')||unistr(''\01F4'')||''-''||unistr(''\01F5'')||unistr(''\01E2'')||''-''||unistr(''\01EF'')||unistr(''\01DE'')||''-''||unistr(''\01DF'')||unistr(''\01CD'')||''-''||unistr(''\01D4'')||unistr(''\01BF'')||unistr(''\01B7'')||unistr(''\01AF'')||''-''||unistr(''\01b0'')||unistr(''\01A0'')||''-''||unistr(''\01A1'')||unistr(''\018F'')||unistr(''\0187'')||''-''||unistr(''\0188'')||unistr(''\0134'')||''-''||unistr(''\017f'')||unistr(''\00AE'')||''-''||unistr(''\0131'')||unistr(''\00A1'')||''-''||unistr(''\00AC'')||unistr(''\0009'')||unistr(''\000A'')||unistr(''\000D'')||unistr(''\0020'')||''-''||unistr(''\007E'')||'']*$'')'; 這是應該尋找的西裏爾字母和其它特殊的一個長長的清單個字符,但它拋出我下面的:

ORA-00936: missing expression 

我已經嘗試不使用

stmt_template VARCHAR(32767) :='''[^-~]'''; 
01 ASCII表中搜索一切

不過這似乎並沒有給我測試元組我準備(使用某些西裏爾字母,以及一個€標誌之類的東西),但不包含任何「非法」字符的一些行

stmt_template VARCHAR(32767) := '''[^.' || CHR (1) || '-' || CHR (255) || ']'''; 

不起作用,因爲它給我與上面相同

任何人都可以幫助我找出我的錯誤/錯字或任何第一正則表達式中的錯誤嗎?

如果您需要了解更多信息,請告訴我,THX提前

回答

0

你的語句評估爲:

select ID from table_name where regexp_LIKE(table_name.column_name,,'^['||unistr('\20AC')||unistr('\1EF8')||'-'||unistr('\1EF9')||unistr('\1EF2')||'-'||unistr('\1EF3')||unistr('\1EE4')||'-'||unistr('\1EE5')||unistr('\1ED6')||'-'||unistr('\1ED7')||unistr('\1ECA')||'-'||unistr('\1ECF')||unistr('\1EC4')||'-'||unistr('\1EC5')||unistr('\1EBD')||unistr('\1EAA')||'-'||unistr('\1EAC')||unistr('\1EA0')||'-'||unistr('\1EA1')||unistr('\1E9E')||unistr('\1E9B')||unistr('\1E8C')||'-'||unistr('\1E93')||unistr('\1E80')||'-'||unistr('\1E85')||unistr('\1E6A')||'-'||unistr('\1E6B')||unistr('\1E60')||'-'||unistr('\1E63')||unistr('\1E56')||'-'||unistr('\1E57')||unistr('\1E44')||'-'||unistr('\1E45')||unistr('\1E40')||'-'||unistr('\1E41')||unistr('\1E30')||'-'||unistr('\1E31')||unistr('\1E24')||'-'||unistr('\1E27')||unistr('\1E1E')||'-'||unistr('\1E21')||unistr('\1E10')||'-'||unistr('\1E11')||unistr('\1E0A')||'-'||unistr('\1E0B')||unistr('\1E02')||'-'||unistr('\1E03')||unistr('\0292')||unistr('\0259')||unistr('\022A')||'-'||unistr('\0233')||unistr('\01FA')||'-'||unistr('\021F')||unistr('\01F7')||unistr('\01F4')||'-'||unistr('\01F5')||unistr('\01E2')||'-'||unistr('\01EF')||unistr('\01DE')||'-'||unistr('\01DF')||unistr('\01CD')||'-'||unistr('\01D4')||unistr('\01BF')||unistr('\01B7')||unistr('\01AF')||'-'||unistr('\01b0')||unistr('\01A0')||'-'||unistr('\01A1')||unistr('\018F')||unistr('\0187')||'-'||unistr('\0188')||unistr('\0134')||'-'||unistr('\017f')||unistr('\00AE')||'-'||unistr('\0131')||unistr('\00A1')||'-'||unistr('\00AC')||unistr('\0009')||unistr('\000A')||unistr('\000D')||unistr('\0020')||'-'||unistr('\007E')||']*$')) 

其中,正則表達式去除看起來像膽量:

REGEXP_LIKE(table_name.column_name,,'your regex...')) 

您需要從正則表達式字符串的開頭和重複的結束圓括號從結尾刪除重複的逗號。

+0

哦,thx,實際上早些修正了,但後來它仍然給我一樣的錯誤,會編輯帖子! – DasGensu

0

stmt_template VARCHAR(32767) := '^[''''||unistr(''\20AC'')||unistr(''\1EF8'')||''-''|| 
           unistr(''\1EF9'')||unistr(''\1EF2'')||''-''|| 
           unistr(''\1EF3'')||unistr(''\1EE4'')||''-''|| 
           unistr(''\1EE5'')||unistr(''\1ED6'')||''-''|| 
           unistr(''\1ED7'')||unistr(''\1ECA'')||''-''|| 
           unistr(''\1ECF'')||unistr(''\1EC4'')||''-''|| 
           unistr(''\1EC5'')||unistr(''\1EBD'')||unistr(''\1EAA'')||''-''|| 
           unistr(''\1EAC'')||unistr(''\1EA0'')||''-''|| 
           unistr(''\1EA1'')||unistr(''\1E9E'')||unistr(''\1E9B'')||unistr(''\1E8C'')||''-''|| 
           unistr(''\1E93'')||unistr(''\1E80'')||''-''|| 
           unistr(''\1E85'')||unistr(''\1E6A'')||''-''|| 
           unistr(''\1E6B'')||unistr(''\1E60'')||''-''|| 
           unistr(''\1E63'')||unistr(''\1E56'')||''-''|| 
           unistr(''\1E57'')||unistr(''\1E44'')||''-''|| 
           unistr(''\1E45'')||unistr(''\1E40'')||''-''|| 
           unistr(''\1E41'')||unistr(''\1E30'')||''-''|| 
           unistr(''\1E31'')||unistr(''\1E24'')||''-''|| 
           unistr(''\1E27'')||unistr(''\1E1E'')||''-''|| 
           unistr(''\1E21'')||unistr(''\1E10'')||''-''|| 
           unistr(''\1E11'')||unistr(''\1E0A'')||''-''|| 
           unistr(''\1E0B'')||unistr(''\1E02'')||''-''|| 
           unistr(''\1E03'')||unistr(''\0292'')||unistr(''\0259'')||unistr(''\022A'')||''-''|| 
           unistr(''\0233'')||unistr(''\01FA'')||''-''|| 
           unistr(''\021F'')||unistr(''\01F7'')||unistr(''\01F4'')||''-''|| 
           unistr(''\01F5'')||unistr(''\01E2'')||''-''|| 
           unistr(''\01EF'')||unistr(''\01DE'')||''-''|| 
           unistr(''\01DF'')||unistr(''\01CD'')||''-''|| 
           unistr(''\01D4'')||unistr(''\01BF'')||unistr(''\01B7'')||unistr(''\01AF'')||''-''|| 
           unistr(''\01b0'')||unistr(''\01A0'')||''-''|| 
           unistr(''\01A1'')||unistr(''\018F'')||unistr(''\0187'')||''-''|| 
           unistr(''\0188'')||unistr(''\0134'')||''-''|| 
           unistr(''\017f'')||unistr(''\00AE'')||''-''|| 
           unistr(''\0131'')||unistr(''\00A1'')||''-''|| 
           unistr(''\00AC'')||unistr(''\0009'')||unistr(''\000A'')||unistr(''\000D'')||unistr(''\0020'')||''-''|| 
           unistr(''\007E'')||'''']*$'')'; 

看來,最初的定義在字符串的開頭和結尾留下了一個不平衡的單引號您的stmt_template定義更改。我仍然不確定這是否會奏效,因爲在弦的最後端似乎有一個無與倫比的右括號,但它可能會更好。

祝你好運。

0

這應該給你這不是ASCII-7範圍內CHR數據(32) - CHR(127):

select col1 
from my_table 
where regexp_like(col1, '[^'||chr(32)||'-'||chr(127)||']') 

請注意,我不包括控制字符(小於32月)並在我的範圍內擴展ascii(> 127)。