web-dev-qa-db-ja.com

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

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;
/
96
user595234

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

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

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

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

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

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

162
DCookie

これが ブログ投稿 です。これは、文字列のティックをエスケープするのに役立ちます。

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

最も単純で最も使用される方法は、両側に2つの単一引用符を含む単一引用符を使用することです。

SELECT 'single quote' '' dualから;

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

一重引用符をテストする」

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

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

15
cboler

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

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

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

Select 'UPDATE Customers SET LName = ' || chr(39) || 'Doe' || chr(39) || ';' From dual;
11
Corwin01