4

私はOracle 9iデータベースに次のクエリを実行しています:

SELECT * FROM テーブル WHERE 列 LIKE '%' || || 'someText' || '%' エスケープ '\';

Oracle Express 10g データベースでは成功するが、「エスケープ文字は長さ 1 の文字列でなければならない」(ORA-01425 エラー) というエラーで失敗します。

バックスラッシュを 2 つ (ESCAPE '\\') にすると、Oracle 9i データベースの問題は解決しますが、代わりに 10g データベースで同じ ORA-01425 エラーが発生します。

SQL は Telerik OpenAccess ORM を介して自動生成されるため、編集できません。

上記の SQL につながる Linq コードは次のとおりです。

activity.Name.Contains.("someText")

両方のデータベースで ESCAPE '\' を処理したいのですが... または、名前または説明でテーブル項目を検索する別の方法があります。

前もって感謝します!

4

5 に答える 5

2

Linq には詳しくありませんが、クエリを実行している場所について少し混乱しています。生成されたコードを 2 つのデータベースに対して実行されている SQL*Plus に貼り付けているだけで、その動作は少なくとも説明できますか?

SQL*Plus で実行している場合はshow escape、各環境で実行します。escape "\" (hex 5c)10g が報告するのに対し、9i は報告すると思いescape offます。これは、9i インスタンスではエスケープ処理が以前に設定されていたが、(おそらく最近の) 10g インスタンスでは設定されていないことを示している可能性があります。

これまでに関連することが判明した場合set escape \は、10g セッションで実行してから、\\バージョンを再試行してください。そして 9i で試してみて、そこでescape offシングル\バージョンを試してみてください。両方とも動作するはずです。

あなたがまだ私と一緒にいると仮定すると、次の質問は、なぜ 9i にその設定があるのか​​ということです。おそらく、自動的に設定している login.sql または glogin.sql ファイルがあります。生成されたコードを変更せずに実行できるようにするために、他に影響を与えない限り、それを削除できる場合があります。

他の方法でコードを実行する場合は、そのいずれも関係ないと思います。生成されたコードを SQL*Plus でテストおよびデバッグするだけで、最終的に別の場所で実行するかどうかはわかりません (Linq の知識が不足している)。その場合、とにかく一時的な問題である可能性があります。

とにかく、あなたが実際に何を逃れているのかもわかりません...

于 2010-09-15T20:22:53.077 に答える
1

バックスラッシュの問題を完全に回避できます。代わりに、エスケープ文字の周りに中括弧を使用してみてください。

http://download.oracle.com/docs/cd/B10500_01/text.920/a96518/cqspcl.htm

于 2010-09-03T20:36:07.823 に答える
1

すべての入力または特定の文字列だけで失敗しますか? 問題はクエリではなく、入力にある可能性があります。バックスラッシュの数が奇数の場合、Oracle は、エスケープする必要のないものをエスケープしようとする場合があります。

たとえば、これは「%」をエスケープしているため機能します。

select * from dual  where 'test' like '%'||'\'||'%' escape '\';

しかし、エスケープする必要のない「a」をエスケープしようとしているため、これは失敗します。

select * from dual  where 'test' like '%'||'\a'||'%' escape '\';

関数に渡される前に文字列を変更して、奇妙なバックスラッシュを修正できますか?

于 2010-09-16T02:32:31.497 に答える
1

試す:

  SELECT * FROM TABLENAME 
  WHERE COLUMNNAME LIKE '\%' ESCAPE '\';

通常、許可検索記号「%」および「_」に使用される LIKE の ESCAPE 記号

于 2010-09-02T11:11:23.910 に答える
1

誰かが同じ問題で立ち寄った場合... 私の問題は、「NVARCHAR2」フィールドを扱っていたことです。この問題については、オラクル フォーラムでサポートを受けました :)

このクエリ: select * from dual where 'dummy' like '%' escape '\';

フィールド「ダミー」はvarchar2であるため、両方で機能します。nvarchar2 の場合、問題を引き起こす可能性のあるクエリの部分は、「エスケープ '\'」部分になります (私の oracle 9i はエスケープ '\' を必要とし、私の oracle 10g は '\\' を必要とします)。

この問題を解決するために、ORM の自動生成コードを使用する代わりに、次のように nvarchar2 フィールドを処理するストアド プロシージャを作成しました (文字列を検索する場合のみ)。|| 'someText' || N'%' エスケープ N'\'

そして、それはうまく機能しています:)

ただし、同じ NVARCHAR2 列と同じ SQL クエリがあり、2 つの Oracle サーバー (ローカル PC の 10g Express と 9i) で異なる方法で処理された理由は説明できません。これは疑問のままです。したがって、同様の問題が発生している場合は、それが nvarchar2 の問題であるかどうかを知り (問題になる可能性があるとは思いもしませんでした)、回避策を試してみるとよいでしょう。

于 2010-10-22T10:40:11.340 に答える