`
wking_forever
  • 浏览: 59241 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

oracle & 和 ' 特殊字符处理

阅读更多
oracle & 和 ' 特殊字符处理

今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示(plsql 也一样)要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Insert语句,怎么会有自定义变量呢?后来搜索了一下关键字AMP发现,原来是因为在插入数据中有一个字段的内容如下:

http://mobile.three.com.hk/3DX?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(plsql 也一样)中执行,建议在每一个要导入的脚本第一行加上前面那句关闭define的话,否则当你导入第二个含有特殊字符的脚本的时候,又会出错。
          如果是在SQL*PLUS中执行,则只需要设置一次define OFF,后面就可以连续导入了。直到你重新设置define ON为止。

SET DEFINE OFF 的用法;
在SQL*Plus中默认的"&"表示替代变量,也就是说,只要在命令中出现该符号,SQL*Plus就会要你输入替代值。这就意味着你无法将一个含有该符号的字符串输入数据库或赋给变量,如字符串“SQL&Plus”系统会理解为以“SQL”打头的字符串,它会提示你输入替代变量Plus的值,如果你输入ABC,则最终字符串转化为“SQLABC”。
set define off 则关闭该功能,“&”将作为普通字符,如上例,最终字符就为“SQL&Plus”
set define off关闭替代变量功能
set define on 开启替代变量功能
set define *  将默认替代变量标志符该为“*”(也可以设为其它字符)

·方法二:在SQL语句中将'&'替换成chr(38),因为chr(38)是‘&’的ASCII码

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

·方法三:分拆原来的字符串

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


我们可以看到,方法一最为简便,而且效率也最高。方法二因为有一个调用函数的过程,所以性能稍差。方法三需要两次连接字符串,效率最差!

处理 ' 字符

那么如果字段的内容中包含了单引号要怎么插入呢?例如: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;

以上  转自:http://lichangwei.javaeye.com/?page=3&show_full=true (本文稍作了修改)

以上的 ' 转义字符,只能转变 ' 的意思,或者说' 只能转变 ' 为字符,不能对其他字符进行转义  如通配符的转义

通配符的转义
通配符的转义没有专门的字符,或者说,统配符的转义字符用 关键字: ESCAPE 指定,

如下面的t  为转义字符,

SQL> select * from user_tables where table_name like 'GACt_%' escape 't';

TABLE_NAME                     TABLESPACE_NAME                CLUSTER_NAME                  
------------------------------ ------------------------------ ------------------------------
GAC_NITIN                      SYSTEM                                                       

而 ' 也可以指定为 通配符的转义字符 (必须先通过 ' 将 ' 转义)

SQL> select * from user_tables where table_name like 'GAC''_%' escape '''';

TABLE_NAME                     TABLESPACE_NAME                CLUSTER_NAME                 
------------------------------ ------------------------------ ------------------------------
GAC_NITIN                      SYSTEM                                                     

以上两种情况可以理解,下面两种情况却费解了,

下面这条语句执行时,没有弹出对话框,也就是说plsql 没有将 & 当作表示替代变量的符号, 是 \ 将其转义了吗? 为什么 \ 能将其转义? escape 指定的不是 \ 啊? 为什么他还能转义?

SQL> select * from user_tables where table_name like 'GAC\&_%' escape '&';

TABLE_NAME                     TABLESPACE_NAME                CLUSTER_NAME 
------------------------------ ------------------------------ --------------
GAC_NITIN                      SYSTEM                                     

而下面的语句在执行是却弹出对话框要求为 _ 赋替代值, 这是否能说明 escape 没有将其转义, 还是因为到第一个& 时还不知道 escape

已经期指定为:转义字符?

SQL> select * from user_tables where table_name like 'GAC&_%' escape '&';

TABLE_NAME                     TABLESPACE_NAME                CLUSTER_NAME   
------------------------------ ------------------------------ ----------------
GAC_NITIN                      SYSTEM                                       

很奇怪,  like 'GAC\&_%' escape '&';  这里面的 \ 居然将& 转义了 为什么?

这些可能涉及到闭包之类的知识(隐隐约约记得编译原理老师讲过)  当初没学会, 现在要加倍努力!



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gjswxhb/archive/2010/12/17/6083242.aspx
分享到:
评论
1 楼 wencan83 2011-07-21  
不错,我找的就是set define off

相关推荐

    Oracle用户密码含有特殊字符导致无法登陆解决方法

    今天碰到一个比较奇怪的问题: 在客户端上使用sqlplus用普通用户可以... 本来以为客户端是32位的缘故,就在oracle服务器上用sqlplus登录,也还是一样 SQL> conn system@webdata Enter password: ERROR: ORA-12541: TNS

    Oracle数据库学习指南

    21. Oracle特殊包 22. Oradim工具的用法 23. PB如何连接Oracle数据库 24. ROLLBACK不能回滚的命令 25. 安装Oracle后,经常使用的修改表空间的SQL代码 26. 比较SQL Server与Oracle、DB2 27. 多个数据库时,如何...

    Oracle实用教程_04章_Oracle数据类型和函数[整理].pdf

    Oracle 数据类型的使用和研究是早于计算机技术的出现的,使用不同的数据类型是为了保存和处理现实生活中不同性质信息的需要。例如统计人数可以用整型数据、计算有整有零的工资和利息使用浮点数、而要记录人的姓名就...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...

    Oracle Database 11g初学者指南--详细书签版

    在过去的14年中,他与IanAbramson和MichaelCorey为OraclePress合著了一系列图书.Abbey在国际Oracle用户团体非常活跃,经常出席COLLABORATE、OraclecOpenWorld和区域性用户组会议.  Michael J.Corey是Ntirety...

    ORACLE9i_优化设计与系统调整

    §3.2.2 在参数值中使用特殊字符 65 §3.2.3 修改参数值 66 §3.2.4 显示当前参数值 69 §3.2.5 参数的使用 69 §3.2.6 参数的类型 69 §3.2.7 不能在参数文件中指定的参数 70 §3.2.8 当参数指定错误时怎么办? 70 ...

    最全的oracle常用命令大全.txt

    一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup SVRMGR>quit b、关闭...

    oracle数据同步到Greenplum的python脚本

    5、特殊字符处理:删除:'\u0000','"',oracle数据回车符:'\r','\n' 6、支持按分区导入 7、支持内存处理数据导入greenplum,导入失败生成csv格式文件,方便排错 8、支持生成csv格式文件导入greenplum。 9、传递不同...

    oracle数据库11G初学者指南.Oracle.Database.11g,.A.Beginner's.Guide

    《Oracle Database 11g初学者指南》带领读者循序渐进地学习数据库设置、管理、编程、备份和恢复。还深入介绍了SQL和PL/SQL。为了易于学习,这本独特的Oracle Press指南是这样组织的: 核心概念——Oracle Database ...

    Oracle9i的init.ora参数中文说明

    说明: 为以下各项指定命名约定, 包括日期和星期的编号, 默认日期格式, 默认小数点字符和组分隔符, 以及默认的 ISO 和本地货币符号。可支持的区域包括美国, 法国和日本。有关所有区域的信息, 请参阅 Oracle8i ...

    历史上最强的sql FAQ for Oracle

    [A]可以用ASCII码处理,其它特殊字符如&也一样,如 insert into t values('i'||chr(39)||'m'); -- chr(39)代表字符' 或者用两个单引号表示一个 or insert into t values('I''m'); -- 两个''可以表示一个' [Q]怎样...

    实体类生成器(V2)

    如中间有特殊字符,空格等. 7.命名空间名,包名不应为空. 8.Java类型参数和.Net类型参数应分开. 9.生成的实体类的各个部分应该容易改动. 10.类名应该加上后缀. 11.保证Java类名首字母大写 保证Java字段名首字母小写. ...

    Oracle除去数据中的换行符以免读取出现问题

    很多数据存进数据库后,可能需要将整条数据取出,并用特殊符号分割,而且整条数据必须是处于一行,如此,如果... 您可能感兴趣的文章:Oracle中serveroutput参数一次设置永久保存方法oracle导出sql语句的结果集和保存执

    oracle10g超级帮助文件(中文版).chm

    [A]可以用ASCII码处理,其它特殊字符如&也一样,如 insert into t values('i'||chr(39)||'m'); -- chr(39)代表字符' 或者用两个单引号表示一个 or insert into t values('I''m'); -- 两个''可以表示一个'

    通用的固定长度编码格式的字符串查找算法的实现

    字符串的查找是数据库应用中必不可少的操作,而且每种数据库产品(ORACLE、DB2、SYBASE、MS SQL SERVER、MYSQL等等)也都提供了对应的字符串处理函数,比如DB2的LOCATE函数。 但在实际的工作中,还是会遇到一些特殊...

    Oracle事例

    22、去除数据库中特殊字符 <1>.字符串字段中含有\"\'\",如果用来组合sql语句,会造成语句不准确。 比如:replace(f1,\'\'\'\',\'\') <2>.字符串字段中含有\"\\t \\n\",如果用来在c或者c++程序中输出到文件,...

    oracle数据库中如何处理clob字段方法介绍

    插入: 直接写在SQL里面是不行的,一来SQL脚本有字符数限制,而来文章内容包含许多特殊字符,如换行,引号, 之类的东西,很麻烦。网上流行通用做法是先插入一个空CLOB字段,用empty_clob()方法来创建空字段,如: ...

    Perl 实例精解(第三版).pdf

    5.3.11 特殊字符串运算符和函数 5.3.12 生成随机数 5.3.13 rand/srand函数 练习4 运算符 第6章 条件 6.1 控制结构,块和复合语句 6.2 决策--条件结构 6.2.1 if和unless语句 6.2.2 unless语句...

    orcale常用命令

    依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。 下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 1、用户 查看当前用户的缺省表空间 SQL>select username...

    基于PHP&&Layui 博客系统,简约易学,美观优雅,适合初学者。.zip

    PHP内置丰富的数据类型(如整型、浮点型、字符串、数组、对象等),并提供了大量的预定义函数,涵盖了字符串操作、数学运算、文件系统处理、日期时间处理、数据库连接等常见功能,极大提高了开发效率。 在Web开发中...

Global site tag (gtag.js) - Google Analytics