Oracle 10g
とOracle 11g
を使用します。N関数は既存のクエリに問題を引き起こす可能性がありますか?
また、.netで書かれた疑似SQLコード(SqlAlchemy for Pythonのようなもの)からクエリを自動的に作成するレイヤーがあります。
私たちの層は、現在、非ANSI文字が含まれている場合、それは自動的にUnicodeのバイト(のような\00E0
)として書かれた特殊文字でUNISTR
を構成する、単一引用符'
で任意の文字列をラップして。このアルゴリズムは、同じ文字列フィールドが時々'my simple string'
として渡され、時にはUNISTR('my string with special chars like \00E0')
としてラップされたクエリを作成でき
INSERT INTO ... (...) SELECT ... FROM DUAL UNION ALL SELECT ... FROM DUAL ...
:
は、今、私たちは、以下の構築物を用いて複数の挿入を行うための方法を作成しました。説明された条件は、ORA-12704: character set mismatch
を引き起こします。
一つの解決策は、INSERT ALL
構文を使用することですが、それは今で用いたものに比べ非常に遅いです。
もう1つの解決策は、で既にラップされているものを除き、N
を任意の文字列の前に置くようにレイヤーに指示することです。これは簡単です。
これが既存のクエリに何らかの副作用を引き起こす可能性があるかどうかを知りたいだけです。
注:DB上のすべてのフィールドは、NCHAR
またはNVARCHAR2
のいずれかです。
のOracle REF:あなたが求めているものをhttp://docs.oracle.com/cd/B19306_01/server.102/b14225/ch7progrunicode.htm
ターゲットの列サイズがわかっている場合は、キャストすることもできます。または、レイヤーが適切な一括挿入メカニズムをサポートしている可能性があります。しかし、確実に 'n '...' 'を使うことは、データベース文字セットから各国文字セットへの挿入時のリテラルの暗黙の変換を避けるだけですか? –
@AlexPoole誠実に、私はあなたの質問を理解していない... – Teejay
ステートメントごとに挿入されている行の数はいくつですか? 'INSERT ALL'が' UNION ALL'よりも遅い場合、私の答え[here](http://stackoverflow.com/a/11663076/409172)で説明されているように、Oracleの解析問題に遭遇している可能性があります。巨大なSQL文の長い解析時間を避けるために、 'INSERT ALL'をより小さなチャンクに分割するだけで十分でしょう。 –