2008-09-30 103 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的运动&健身