0

私のクエリはオラクル内で正常に動作していますが、オラクル コマンド内に追加すると、[AZ] でエラーが発生し、\1\3 は認識されない文字を示します。正しくするには @ some where を使用する必要があると思いますが、どこかわかりませんか?

*ユーザー名のないトリガーの定義を表示するクエリ: ALTER TRIGGER で始まる行も削除します.. *

OracleCommand Command = new OracleCommand(@"SELECT regexp_replace(dbms_metadata.get_ddl('TRIGGER','" + triggernames + "'),'(CREATE OR REPLACE TRIGGER )("[A-Z]+"\.)(.+)(ALTER TRIGGER .+)','\1\3', 1, 0, 'n')FROM dual", connection))

結果:

CREATE OR REPLACE TRIGGER "USER"."EMP"
    BEFORE INSERT OR UPDATE
    of salary
    on employee
    for each row
   declare
       v_error VARCHAR2(20);
    begin
       if :new.salary > 10
      then
           v_error:=:old.first_name||' cannot have that much!';
           raise_application_error(-20999,v_error);
       end if;
end;
ALTER TRIGGER "USER"."EMP" ENABLE

期待される結果:

CREATE OR REPLACE TRIGGER "EMP"
    BEFORE INSERT OR UPDATE
    of salary
    on employee
    for each row
   declare
       v_error VARCHAR2(20);
    begin
       if :new.salary > 10
      then
           v_error:=:old.first_name||' cannot have that much!';
           raise_application_error(-20999,v_error);
       end if;
end;
4

1 に答える 1

1

@ すべてのエスケープは行いません。[AZ] を囲む引用符は「\」でエスケープする必要があります。

\1\3、'\' との同じ取引は、実際にはリテラルの '\' を意味するエスケープ シーケンスであると言っています。

例えば:

OracleCommand Command = new OracleCommand(@"SELECT regexp_replace(dbms_metadata.get_ddl('TRIGGER','" + triggernames + "'),'(CREATE OR REPLACE TRIGGER )(\"[A-Z]+\"\.)(.+)(ALTER TRIGGER .+)','\\1\\3', 1, 0, 'n')FROM dual", conn1))

あるいは、2 番目の '@' を使用する場合は、quote-escape-sequence (二重の "") を使用する必要があります。

例えば:

@"SELECT regexp_replace(dbms_metadata.get_ddl('TRIGGER','" + triggernames + @"'),'(CREATE OR REPLACE TRIGGER )(""[A-Z]+""\.)(.+)(ALTER TRIGGER .+)','\1\3', 1, 0, 'n')FROM dual"
于 2013-09-30T02:16:00.597 に答える