質問
OK、これは少しわかりにくい質問ですが、誰かが私を助けてくれることを願っています。
私が取り組んでいるシステムは、ストアド プロシージャ内で実行するための動的 SQL 文字列を構築し、その動的 SQL の一部で列エイリアスを定義します。列エイリアス自体は、実際にはユーザー生成データの別のテーブルから取得した値です。
したがって、たとえば、文字列は次のようになります。
SELECT table1.Col1 AS "This is an alias" FROM table1
これはうまくいきます。ただし、エイリアスに使用される値には、外側の引用符を区切る二重引用符文字が含まれる可能性があります。エイリアス内の二重引用符を何らかの方法でエスケープできるかもしれないと考えましたが、その方法を見つけることができませんでした。バックスラッシュは機能せず、2 つの二重引用符を続けて使用すると、このエラーが発生します。
SQL Error: ORA-03001: unimplemented feature
03001. 00000 - "unimplemented feature"
*Cause: This feature is not implemented.
以前にこの問題に遭遇した経験のある人はいますか?誰かが持っている洞察に乾杯。
追記エイリアスにはスペースを含めることができるため、エイリアスを引用符で囲む必要があります。
解決
コード内で二重引用符の代わりに別の文字を入れて、それを二重引用符に置き換えることはできますか?
このようなもの:
SELECT table1.Col1 AS "This is |not| an alias" FROM table1
次に、交換するだけです|と "。
ハッキングであることはわかっていますが、これより良い解決策が思いつきません...そして、あなたがそこでやっていることはとにかくハッキングです。「良い」方法は、値と列名を個別に選択し、コード内でそれらを関連付ける方法です。そうすれば物事はずっときれいになるでしょう。
他のヒント
Oracle の引用演算子を使用します。
select q'#someone's quote#' from dual;
「#」は任意の文字に置き換えることができます
これを実行すると:
select 'test"columnname"' from dual
Oracle はこれを返します (Oracle が生成した列名に注目してください)。
'TESTCOLUMNNAME'
--------------------------------
test"columnname
Oracle の列名に二重引用符が含まれていないという事実は、Oracle がそれを表現できない可能性があることを示しています。
私の知る限り、列名を使用する前にデータから二重引用符を削除するのが最善の策です。残念ながら、そのためには、次の場合にも同じフィルタリングを行う必要があります。 選択する それらの列がありますが、他の方法が見つかりません。
おそらく有益な調査分野は、見積もり方法を検討することです。
私の $quotedString = $dbh->quote( $string );
これを試してみてください。出力では 2 つの一重引用符が実際には 1 つの二重引用符のように見えます。
select 1 as "University ''John Smith''" from dual;