2017-10-12 5 views
0

現在、キリル文字または非ラテン1文字を含む表内のすべての行のIDを出力する方法を理解しようとしています。 )文字列に関係なく、どの列にあるのか 私は、テーブルと列を反復処理するためにカーソルを使用するスクリプトを継承し、unistr()を使って正規表現を使ってキリル文字を検索しますが、それが私たちのOracleの12デシベルにもう動作していないように見える理由PL/SQL:正規表現を介してすべてのキリル文字(または非ラテン1)を検索

文は次のとおりです。

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

TABLE_NAMEと列名は、EXPをselftする必要があります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'')||'']*$'')'; エラーがスローされます:「STMT」を以下の(と作品)として使用されています文字、それは次のように私をスローかかわら:

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)||']') 

ノート(12月32未満)私の範囲ではアスキー(> 127)が拡張されました。

関連する問題