2008-09-30 104 views

回答

53

我繼續忘記這一點,並再次回到它!我認爲最好的答案是迄今爲止提供的答覆的組合。

首先,&是sqlplus/sqldeveloper中的變量前綴,因此問題 - 當它出現時,它有望成爲變量名的一部分。

SET DEFINE OFF將停止sqlplus解釋&這種方式。

但是,如果您需要使用sqlplus變量文字&字符?

  • 時候才需要設定上定義使變量工作
  • 和SET逃脫逃脫&用途。

例如,

set define on 
set escape on 

define myvar=/forth 

select 'back\\ \& &myvar' as swing from dual; 

產地:

old 1: select 'back\\ \& &myvar' from dual 
new 1: select 'back\ & /forth' from dual 

SWING 
-------------- 
back\ & /forth 

如果你想使用一個不同的轉義字符:

set define on 
set escape '#' 

define myvar=/forth 

select 'back\ #& &myvar' as swing from dual; 

當您設置一個特定的轉義字符,你可能會看到「SP2-0272:逃生字符不能是字母數字或空白'。這可能意味着你已經定義了轉義字符,並且事情變得非常可怕。避免這個問題的清潔方法是,在第一關逃跑:

set escape off 
set escape '#' 
+0

np!正如我所說的,我一直在忘記這一點,很高興有機會記錄「綜合答案」;-) – tardate 2009-01-20 08:06:45

+0

這[SQL * Plus常見問題](http://www.orafaq.com/wiki/SQL*Plus_FAQ# How_does_one_disable_interactive_prompting_in_SQL.2APlus.3F)提供了類似的答案。 – DavidRR 2012-11-16 14:15:22

0

如果您使用的是SQL加上那麼我認爲你需要發出命令

SET SCAN OFF 
16

如果從SQLPLUS做它用

SET DEFINE OFF 

阻止它踩&作爲一種特殊的案例

+3

作品在SQL Developer也 – 2008-09-30 15:47:43

1
SET ESCAPE ON; 
INSERT VALUES("J\&J Construction") INTO custnames; 

(未測試,沒有一個Oracle盒在手,它有已經有一段時間)

+1

然後,你必須有指定反斜槓特殊處理。 – 2008-09-30 15:47:03

2

我發現,使用以下任一選項的工作原理:

SET DEF OFF

SET SCAN OFF

我不知道有足夠的瞭解數據庫知道如果一個比另一個更好或更「正確」。另外,如果有什麼比這兩者更好,請讓我知道。

4

在程序中,始終使用參數化查詢。它避免了SQL注入攻擊以及SQL解析器特有的任何其他字符。

5

正確的語法是

set def off; 
insert into tablename values('J&J'); 
0

停止使用SQL /另外,我強烈建議PL/SQL Developer這是不是一個SQL工具等等。

p.s.有些人更喜歡TOAD

+0

如果您需要在Unix/Linux上運行,該怎麼辦? :) – Neels 2014-10-09 14:50:18

5

總是有CHR()函數,它的ASCII碼轉換爲字符串。

即。類似: INSERT INTO 表 VALUES( CONCAT( 'J',CHR(38), 'J') )

7

一種替代的解決方案,使用級聯和Chr函數:

select 'J' || chr(38) || 'J Construction' from dual; 
2

您可以插入如下字符串:'J'||' &'||'建築'。 它工作正常。

insert into table_name (col_name) values('J'||'&'||'Construction'); 
0

看,安德魯:

「Ĵ&Ĵ施工」

SELECT CONCAT( 'J',CONCAT(CHR(38), 'Ĵ施工'))FROM DUAL ;

0
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness') 

此查詢的輸出:Jonhy的運動&健身