PL / SQL、文字列内の単一引用符をエスケープする方法は?


114

Oracle PL / SQLで、文字列内の単一引用符をエスケープする方法は?私はこの方法を試しましたが、機能しません。

declare
  stmt varchar2(2000);
begin
  for i in 1021 .. 6020
  loop
    stmt := 'insert into MY_TBL (Col) values(\'ER0002\')';

    dbms_output.put_line(stmt);
    execute immediate stmt;
    commit;
  end loop;
exception
  when others then
    rollback;
    dbms_output.put_line(sqlerrm);
end;
/

回答:


184

リテラル引用符を使用できます。

stmt := q'[insert into MY_TBL (Col) values('ER0002')]';

リテラルのドキュメントはここにあります

または、2つの引用符を使用して単一引用符を表すことができます。

stmt := 'insert into MY_TBL (Col) values(''ER0002'')';

Q構文によるリテラル引用メカニズムは、より柔軟で読みやすいIMOです。


19

ここだブログ記事の文字列でダニをエスケープを支援すべきです。

上記の投稿からの最も簡単な方法は次のとおりです。

最もシンプルで最も使用される方法は、両側に2つの単一引用符を1つ持つ単一引用符を使用することです。

デュアルから 'test single quote' ''を選択します。

上記のステートメントの出力は次のようになります。

単一引用符をテストする

単一引用符文字を印刷するには、追加の単一引用符文字が必要であることを単に述べます。つまり、単一引用符を2つ付けた場合、Oracleは1つを出力します。最初の1つはエスケープ文字のように機能します。

これは、Oracleで単一引用符を印刷する最も簡単な方法です。しかし、引用符を1つではなく1組だけ印刷する必要がある場合は、複雑になります。この状況では、次の方法が適切に機能します。しかし、それはさらにタイピングの労力を必要とします。


13

上記のDCookieの回答に加えて、単一引用符にchr(39)を使用することもできます。

これは、大量の既存のデータに基づいて多数の挿入/更新ステートメントを作成する必要がある場合に特に便利です。

これは非常に簡単な例です:

FirstNameとLastNameの2つの列を持つ非常にシンプルなCustomersテーブルがあるとします。データをCustomers2に移動する必要があるため、一連のINSERTステートメントを生成する必要があります。

Select 'INSERT INTO Customers2 (FirstName, LastName) ' ||
       'VALUES (' || chr(39) || FirstName || chr(39) ',' || 
       chr(39) || LastName || chr(39) || ');' From Customers;

これは、ある環境から別の環境にデータを移動するとき、または環境をすばやく再構築するときに非常に役立つことがわかりました。


0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; 私のために働いた。varchar/ stringを2組の単一引用符で閉じるとうまくいきます。他のオプションはusing、キーワードEXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'; 覚えているusingキーワードの意志ではない仕事をあなたが使用している場合は、EXECUTE IMMEDIATEパラメータでDDLのを実行するために、しかし、引用符を使用すると、DDLのために動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.