今日在导进一批数据Oracle时,遇到了那样一个难题:Toad提醒要给一个自定义变量AMP取值,一开始我很纳闷,数据是一系列的Insert句子,为什么会有自定义变量呢?之后检索了一下关键词AMP发觉,原先是由于在插进数据中有一个字段名的內容以下:

http://xxx.com/三维X?uid=0676&sid=rt_060908

Oracle把这儿的URL的主要参数连接符&当做是一个自定义变量了,因此规定我给变量AMP取值。历经检测以后,小结出下列三种方式:

方式一:在要插进的SQL句子前再加上Set define off;与原SQL句子一起大批量实行

我们在SQL*PLUS下实行 SQL> show all指令时,能够 发觉一个主要参数:define "&" (hex 26),编码以下所显示

......
concat "." (hex 2e)
copycommit 0
copytypecheck ON
define "&" (hex 26)
describe DEPTH 1 LINENUM OFF INDENT OFF
echo OFF
......

这个是Oracle里边用于鉴别自定义变量的设定,如今我们在SQL*PLUS下将其关掉:

SQL> Set define OFF;

随后再度实行导进脚本制作,OK!难题拿下。

留意:如果是在TOAD中实行,提议在每一个要导进的脚本制作第一行再加上前边那句关掉define得话,不然如果你导进第二个带有特殊符号的脚本制作的情况下,又会错误。
如果是在SQL*PLUS中实行,则只必须设定一次define OFF,后边就可以持续导进了。直至你再次设定define ON才行。

插进一条句子:

SQL> insert into AA (O,resvalue) values ('AA', 'S'||chr(38)||'P');

方式二:在SQL句子里将'&'换成chr(38),由于chr(38)是‘&'的ASCII码

SQL> Select 'Tom' || chr(38) || 'Jerry' from dual;

方式三:拆分原先的字符串数组

SQL> Select 'Tom' || '&' || 'Jerry' from dual;

我们可以见到,方式一更为简单,并且高效率也最大。方式二由于有一个调用函数的全过程,因此特性稍弱。方式三必须2次联接字符串数组,高效率最烂!

那麼假如字段名的內容中包括了单引号要怎么插入呢?比如:It's fine。这类状况下一样有三种方式:

方式一:应用转义字符

SQL > Select 'test' || '''' from dual;

留意:这儿的''''四个单引号代表什么意思呢?最先第一个和最后一个全是Oracle中的字符串数组连接符,这一沒有质疑。那麼第二个'和第三'又表明啥意思呢?第二个'是一个转义字符
第三个'才算是大家真实的內容

方式二:一样是应用转义字符,只不过是方法不一样罢了

SQL > Select 'test ''' from dual;

留意:这儿的第二个,第三个'便是大家上边方式一中提及的转义符和真实的內容

方式三:在SQL里将'换成chr(39),由于chr(39)是'的ASCII码

SQL > Select 'It' || chr(39) || 'fine' from dual;