0

Oracle 10g で 2 つのセルを 1 つに連結するときに作成される無効な文字に問題があります。

次に、文字列が xml ファイルに挿入されます。無効な文字が挿入されると、xml ファイルが破損します。(XML は最大 8 GB になる可能性があり、修正するのは面倒なので、xml が毎日作成される前に実行するように自動化する必要があります。

これの1つのバージョンを見つけるために私が行ってきたことは次のとおりです。

select * from (select ar_journal.jnlinpnum,debtor_ref,dump(narration) as dn,narration from ENERGYDB.ar_journal) where dn like '%31%' and dn not like '%=31:%';

ただし、これは 1 文字のみを戻します。これは多くの文字で発生し、文字 0 ~ 31 および 226 ~ 256 を削除する必要があります。

だから私はこれを試しました、

create table tmp_charprefix(
charf1 Varchar2 (10), charf2 varchar2 (10)) ;


INSERT INTO tmp_charprefix (charf1, charf2) VALUES ('%27%', '%=27%');
INSERT INTO tmp_charprefix (charf1, charf2) VALUES ('%28%', '%=28%');
INSERT INTO tmp_charprefix (charf1, charf2) VALUES ('%29%', '%=29%');
INSERT INTO tmp_charprefix (charf1, charf2) VALUES ('%30%', '%=30%');
INSERT INTO tmp_charprefix (charf1, charf2) VALUES ('%31%', '%=31%');
INSERT INTO tmp_charprefix (charf1, charf2) VALUES ('%60%', '%=60%');
INSERT INTO tmp_charprefix (charf1, charf2) VALUES ('%62%', '%=62%');

上記は、探す私の値です。

create table tmp_charfix as
select aj.jnlinpnum, aj.type_jnl, ajt.jnl_descr, ajei.reason_no, ar.reason_descr, aj.narration
from ar_journal aj, ar_jnl_type ajt, ar_jnl_extra_info ajei, ar_reason ar
where ajt.type_jnl = aj.type_jnl
and ajei.jnlinpnum = aj.jnlinpnum
and ajei.reason_no = ar.reason_no
and aj.jnlinpnum in ( select jnlinpnum from (
select ar_journal.jnlinpnum, debtor_ref, dump(narration) as dn, narration from energydb.ar_journal)
where dn like (select charf1 from tmp_charprefix tmo)
and dn not like (select charf2 from tmp_charprefix tmt)
and substr(tmo.charf1,2,8) = substr(tmt.charf2,3,8) ;

-- charf1 の部分文字列を呼び出し、それを charf2 の部分文字列と照合しようとしています

次のエラーが表示されますが、最後の行で可能なことを行っているかどうかはわかりません

SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

何か助けていただければ幸いです。私はここ数時間これにこだわっています。

ありがとう、

ベン

4

2 に答える 2

0

これは答えではなく提案ですが、コメントに収まりきらないほど長いので、答えとして提示する必要があります。

提案:コードをインデントします。問題の特定がはるかに容易になります。

create table tmp_charfix as
  select
    aj.jnlinpnum,
    aj.type_jnl,
    ajt.jnl_descr,
    ajei.reason_no,
    ar.reason_descr,
    aj.narration
  from
    ar_journal aj,
    ar_jnl_type ajt,
    ar_jnl_extra_info ajei,
    ar_reason ar
  where ajt.type_jnl = aj.type_jnl
    and ajei.jnlinpnum = aj.jnlinpnum
    and ajei.reason_no = ar.reason_no
    and aj.jnlinpnum in ( -- OPEN PAREN HERE WITH NO CLOSING PAREN
      select jnlinpnum from (
        select ar_journal.jnlinpnum, debtor_ref, dump(narration) as dn, narration
        from energydb.ar_journal
      ) -- this parenthesis is also trouble, coming between FROM and WHERE
      where dn like (select charf1 from tmp_charprefix tmo)
        and dn not like (select charf2 from tmp_charprefix tmt)
        and substr(tmo.charf1,2,8) = substr(tmt.charf2,3,8)
    -- Oracle is still waiting for a closing parenthesis here...
于 2013-04-12T15:19:32.043 に答える
0

関連するレコードを選択するには

    select jnlinpnum
         , debtor_ref
         , dn
         , narration
      from (
                select ar_journal.jnlinpnum
                     , debtor_ref
                     , dump(narration) as dn
                     , narration
                     , regexp_instr ( dn, '([^[:digit:]=]|^)(27|28|29|30|31|60|62)([^:[:digit:]]|$)' ) as dn_occurrence
                  from ENERGYDB.ar_journal
           )
     where dn_occurrence > 0
         ;

実際の置換は関数で実行できますregexp_replace。パフォーマンスを確認してください。ただし、8 GB の出力は、このregexp_クラスの機能を使用するには厳しすぎる可能性があります。

于 2013-04-12T17:24:09.830 に答える