2012-02-01 161 views
26

我有一個SQL腳本,它將一個長字符串插入到表中。該字符串包含一個新行(並且此新行是絕對必要的),因此,當它被寫入文本文件時,查詢將被拆分爲多行。喜歡的東西:在sqlplus中插入多行字符串

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

Line2GoesHere 
blablablabla 
'); 

這運行正常的蟾蜍,但是當我保存這個作爲一個.sql文件,並用sqlplus運行它,它會認爲每行一個單獨的查詢,這意味着每行會失敗(怎麼一回事,因爲insert into table(id, string) values (1, 'Line1goesHereLine2GoesHere沒有很好地格式化腳本

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

是否有解決這一問題的方式

+1

我做過正是在SQL Plus和它的作品。你正在運行整個腳本,還是突出顯示該部分並運行它? – MJB 2012-02-01 03:01:44

+0

啊,我忘了說我把它保存爲一個文件並使用命令運行這個文件。我編輯了問題描述 – 2012-02-01 03:06:28

回答

47

啓用SQLBLANKLINES允許在SQL語句中的空行,例如:?

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

blablablabla 
'); 

這個問題的前提有點不對。 SQL * Plus默認允許多行字符串。它只是空白線路導致問題。

+0

+1謝謝 - 我今天學到了一些新東西:) – 2012-02-01 03:53:27

+0

SQLBLANKLINES對於下一個查詢將保持「開啓」狀態,還是僅影響當前查詢? – 2014-04-14 15:49:44

+0

它會影響整個會話 - 從連接到註銷。因此,您可能必須根據需要將其設置爲OFF或ON。 – 2014-04-21 21:10:26

0

插入換行符爲一個字符串的另一種方式是串聯:

chr(13)||chr(10) 

(在Windows上)

或者只是:

chr(10) 

(否則)

2

SQL * Plus手冊

您可以結束在以下三種方式之一SQL命令:

  1. 用分號(;)
  2. 與線路上的斜槓(/)由本身
  3. 以一個空行

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]具有類似的行爲。

4

您還可以使用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 
+1

這更好,因爲它不是SQL * Plus特有的。 +1。 – jpmc26 2017-07-19 12:17:22