テーブルに長い文字列を挿入する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.
_
これを修正する方法はありますか?
SQLステートメントで空白行を許可するには、SQLBLANKLINES
を有効にします。例えば:
SET SQLBLANKLINES ON
insert into table(id, string) values (1, 'Line1goesHere
Line2GoesHere
blablablabla
');
この質問の前提は少し間違っています。 SQL * Plusでは、デフォルトで複数行の文字列が許可されています。問題を引き起こすのは空白行のみです。
OracleのSQLのあまり知られていない機能も使用できます。 Perlスタイルの引用符付き文字列
SQL> select q'[f dfgdfklgdfkjgd
2 sdffdslkdflkgj dglk
3 glfdglkjdgkldj ]'
4 from dual;
Q'[FDFGDFKLGDFKJGDSDFFDSLKDFLKGJDGLKGLFDGLKJDGKLDJ]'
----------------------------------------------------
f dfgdfklgdfkjgd
sdffdslkdflkgj dglk
glfdglkjdgkldj
SQL * Plusマニュアル
SQLコマンドは、次の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]にも同様の動作があります。
文字列に改行を挿入するもう1つの方法は、連結です。
chr(13)||chr(10)
(Windowsの場合)
あるいは単に:
chr(10)
(さもないと)