Escaping single quote in PLSQL

PLSQLで次のような文字列を生成したい:

COMMENT ON COLUMN TABLE.COLUMN IS 'comment from database';

私の解決策は次のとおりです。

declare
  str_comment varchar2(4000);
begin
  for rec in (select table_name, column_name, description from description_table)
  loop
    str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name||'  IS '''||rec.description||'''; ' ;
    dbms_output.put_line(str_comment);
  end loop;
end;

に単一のqoutが含まれていない場合、出力はOKですrec.description。それ以外の場合は、エスケープレターが必要です。どのように実装すればよいですか?

OK出力行(単一のqouteを保持するためのエスケープ文字があります):

COMMENT ON COLUMN TABLE1.COLUMN1_LV  IS 'It''s secret';

一重引用符のエスケープ文字が追加されておらず、コンパイルされないため、出力行はNOKではありません。

COMMENT ON COLUMN TABLE1.COLUMN1_LV  IS 'It's secret';

私の解決策は、説明に一重引用符が含まれているかどうかを確認しないことです。COMMENT ON文字列を生成する前に、ソース(説明)列の一重引用符を2つの一重引用符に置き換えてから、私はROLLBACK

より良い解決策はありますか?オラクルplsql共有この質問を改善するフォローする2016年6月3日13:45に編集mik2,5201ゴールドバッジ1個1717個のシルバーバッジ2323個のブロンズバッジ2011年7月13日11:58に 尋ねたreforrer70577つのゴールドバッジ1212個のシルバーバッジ1717個のブロンズバッジ

  • 一重引用符を二重引用符に置き換えることは問題ありません。のポイントはROLLBACK何ですか?コード全体(置換とロールバックを含む)を投稿していただけますか? –  Quassnoi 2011 年7月13日12:04
  • @Quassnoi彼はおそらくdescription_tableを更新してから、更新をロールバックします –  mik 2016年6月3日12:55

コメントを追加

4つの答え

アクティブ最古投票36

私はこのソートをかなり行います(通常は挿入/更新ステートメントを生成します)。

すべてをに'変換するには、replace関数を使用する必要があります''。つまり、次のように変更します。

str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name
            ||' IS '''||REPLACE( rec.description,'''','''''')||'''; ' ;

共有この答えを改善するフォローする2011年7月13日12:04に 回答Sodved7,8422727個のシルバーバッジ3939個のブロンズバッジコメントを追加18

次のようなQuote演算子を使用できます

str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name||' IS q''[' ||rec.description|| ']'';' ;

http://psoug.org/reference/string_func.htmlを参照してください共有この答えを改善するフォローする2011年7月13日13:05に編集2011年7月13日12:32に 回答schurik7,35922つのゴールドバッジ1919個のシルバーバッジ2929個のブロンズバッジ

  • 説明自体にが含まれている場合、これは機能しません]'。 –  mik 2016年 6月3日12:44
  • ただし、[および]の代わりに他の文字を使用することもできます。実際、スペース、RETURN、またはタブ以外のもの。 –  dCookie 2017 年2月2日15:26 
  • @mikこれは古いコメントですが、この回答にリダイレクトされる人のために、引用符で囲まれた文字列に引用符を含めることはまったく問題ありません。たとえば、次の例は、少なくとも11.2.0.4で、完璧に動作します:SELECT q'{{test}{from}}' FROM dual;このリターン:{test}{from} –  Boneist 18時07分で、3月7日’18を
  • @Boneistですが、私が書いたように、含めることはできません}'(引用文字の後にアポストロフィが続きます) –  mik 2018年 3月9日14:49
  • @mikああ、良い点。どういうわけか私は見なかったので、明らかに私は新しいアイテストが必要'です… d’oh! – ボネスト2018年 3月9日15:10 

コメントを追加2

REPLACE選択した機能を使用します。

declare
str_comment varchar2(4000);
begin
for rec in (SELECT table_name, column_name, REPLACE(description, '''', '''''') 
                FROM description_table)
loop
str_comment:='COMMENT ON COLUMN ' || rec.table_name || '.' 
                 ||rec.column_name|| ' IS ''' ||rec.description|| '''; ' ;
dbms_output.put_line(str_comment);
end loop;
end;

共有この答えを改善するフォローする2011年7月13日12:05に回答ディーシー21.5k55つのゴールドバッジ5353個のシルバーバッジ8787個のブロンズバッジ

  • にフィールドPLS-00302: component 'DESCRIPTION' must be declaredがないため、これにより、が得descriptionられrecます。の後に列エイリアスを追加するか、を割り当て先ステートメントにREPLACE()入れる必要があります。REPLACEstr_comment –  MIK 12:11で12月1日’20

コメントを追加-3

コードで ”を使用する必要がありますが、実際のコードで試す前に、

二重引用符が含まれている行を試してください

例えば:

select '''sumesh''' from dual

共有この答えを改善するフォローする2012年6月8日11:58に編集ルーク11.3k4343ゴールドバッジ5858個のシルバーバッジ6767個のブロンズバッジ2012年6月8日10:46に 回答Sumesh17

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA