使用sqlplus在Oracle中插入多行字符串

时间:2012-02-01 02:50:27

标签: sql oracle newline sqlplus

我有一个SQL脚本,它会将长字符串插入表中。该字符串包含一个新行(并且这个新行是绝对必要的),因此当它在文本文件中写入时,查询将被拆分为多行。类似的东西:

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

Line2GoesHere 
blablablabla
');

这在Toad中运行正常,但当我将其保存为.sql文件并使用sqlplus运行时,它会将每一行视为一个单独的查询,这意味着每一行都将失败(beacuse insert into table(id, string) values (1, 'Line1goesHere,{{1不是格式良好的脚本。

Line2GoesHere

有没有办法解决这个问题?

4 个答案:

答案 0 :(得分:50)

启用SQLBLANKLINES以允许SQL语句中出现空行。例如:

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

blablablabla
');

这个问题的前提是略有错误。 SQL * Plus默认允许多行字符串。只有空白行会导致问题。

答案 1 :(得分:7)

您还可以使用Oracle SQL的不为人知的功能:Perl style quoted strings.

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

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

答案 2 :(得分:3)

  

SQL * Plus手册

     

您可以通过以下三种方式之一结束SQL命令:

     
      
  1. 用分号(;)
  2.   
  3. 单独使用斜线(/)
  4.   
  5. 有一个空行
  6.         

    SQL语句或脚本中的空行告诉SQL * Plus您有   完成输入命令,但不想再运行它。按   返回命令最后一行的末尾。

在这种情况下启用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]具有类似的行为。

答案 3 :(得分:0)

将换行符插入字符串的另一种方法是连接:

chr(13)||chr(10)

(在Windows上)

或只是:

chr(10)

(否则)