web-dev-qa-db-ja.com

sqlplusを使用してOracleに複数行の文字列を挿入します

テーブルに長い文字列を挿入するSQLスクリプトがあります。文字列には新しい行が含まれているため(この新しい行は絶対に必要です)、テキストファイルに書き込まれると、クエリは複数の行に分割されます。何かのようなもの:

_insert into table(id, string) values (1, 'Line1goesHere 

Line2GoesHere 
blablablabla
');
_

これはToadで正常に実行されますが、これを.sqlファイルとして保存し、sqlplusを使用して実行すると、各行が個別のクエリと見なされます。つまり、各行が失敗します(insert into table(id, string) values (1, 'Line1goesHere、_Line2GoesHere_は整形式のスクリプトではありません。

_SP2-0734: unknown command beginning "Line2GoesHere" - rest of line ignored.
_

これを修正する方法はありますか?

31
Louis Rhys

SQLステートメントで空白行を許可するには、SQLBLANKLINESを有効にします。例えば:

SET SQLBLANKLINES ON
insert into table(id, string) values (1, 'Line1goesHere 
Line2GoesHere 

blablablabla
');

この質問の前提は少し間違っています。 SQL * Plusでは、デフォルトで複数行の文字列が許可されています。問題を引き起こすのは空白行のみです。

50
jim mcnamara

OracleのSQLのあまり知られていない機能も使用できます。 Perlスタイルの引用符付き文字列

SQL> select q'[f dfgdfklgdfkjgd
  2  sdffdslkdflkgj dglk
  3  glfdglkjdgkldj ]'
  4  from dual;

Q'[FDFGDFKLGDFKJGDSDFFDSLKDFLKGJDGLKGLFDGLKJDGKLDJ]'
----------------------------------------------------
f dfgdfklgdfkjgd
sdffdslkdflkgj dglk
glfdglkjdgkldj
9
ibre5041

SQL * Plusマニュアル

SQLコマンドは、次の3つの方法のいずれかで終了できます。

  1. セミコロン(;)
  2. 行にスラッシュ(/)を単独で使用する
  3. 空白行

SQL文またはスクリプト内の空白行は、コマンドの入力は終了したがまだ実行しないことをSQL * Plusに通知します。コマンドの最後の行の終わりでReturnキーを押します。

この状況でSQLBLANKLINESをオンにすることが答えかもしれませんが、それでも次のSQL * Plusコマンドについて心配する必要があります。

@  ("at" sign)        (Start of line) 
@@ (double "at" sign) (Start of line) 
#   SQLPREFIX         (Start of line)
.   BLOCKTERMINATOR   (Start of line and by itself)
/  (slash)            (Start of line and by itself)
;   SQLT[ERMINATOR]   (Start of line and by itself, or at the end)

SQLPREFIXはオフにできないものです。これはSQL * Plusの機能です。 BLOCKTERMINATORは有効化または無効化できます。一方、新しい行の先頭にスラッシュがあると、バッファー内のコンテンツが実行されます。 SQL [TERMINATOR]にも同様の動作があります。

4
Chad

文字列に改行を挿入するもう1つの方法は、連結です。

chr(13)||chr(10)

(Windowsの場合)

あるいは単に:

chr(10)

(さもないと)

1
A.B.Cade