原文地址:http://blog.csdn.net/gjswxhb/article/details/6083242

今天在导入一批数据到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 '&';  这里面的 / 居然将& 转义了 为什么?

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

转载于:https://www.cnblogs.com/dirgo/p/8522608.html

【转】oracle 和 ' 特殊字符处理 ( like 'GAC/_%' escape ''; 这里面的 / 居然将 转义了 为什么?)...相关推荐

  1. oracle 和 ' 特殊字符处理

    oracle & 和 ' 特殊字符处理 2011年09月16日 星期五 12:22 oracle & 和 ' 特殊字符处理 今天在导入一批数据到Oracle时,碰到了一个问题:Toad ...

  2. oracle中特殊字符处理

    oracle中特殊字符处理 notepadd++中显示所有在字符观察 CR意思是carriage return,回车,\r,ASCII码为13 LF意思是linefeed,换行,\n,ASCII码为1 ...

  3. oracle 特殊的字符,Oracle一些特殊字符转义

    转载做备忘记录: SQL> select * from test; TEST -------------------- sdd_kk d'd dfsfsa dffa%asfs 12345 1%2 ...

  4. underscore 系列之字符实体与 _.escape

    前言 underscore 提供了 _.escape 函数,用于转义 HTML 字符串,替换 &, <, >, ", ', 和 ` 字符为字符实体. _.escape(' ...

  5. JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解

    JS 字符串编码函数(解决URL特殊字符传递问题):escape().encodeURI().encodeURIComponent()区别详解 参考文章: (1)JS 字符串编码函数(解决URL特殊字 ...

  6. 解决特殊字符引起json解析错误--单引号、双引号转义

    解决特殊字符引起json解析错误–单引号.双引号转义 这几天在做一个题库管理,遇到了一个问题,将后台的json数据传到前台用parse解析时,出现了一个错误: Uncaught SyntaxError ...

  7. oracle日记账单据编号未生成_商管财务数据平台Oracle与共享未付池差异如何核对、解决?...

    ‍‍近期,总部新上线财务数据平台啦!各个系统间的差异异常数据清晰可见,随时可查,今天就和小伙伴们一起分享一下Oracle与共享未付池差异如何核对.解决.首先,将Oracle与共享未付池差异数据导出.由 ...

  8. oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...

    本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...

  9. oracle视图能用etl工具_(转)使用kettle作为sqlserver2008和oracle10G之间的ETL工具

    转 http://blog.sina.com.cn/s/blog_664558d30100qga9.html 实际工作过程中,常常会遇到将数据从一个数据库迁入到另外一个数据库,以sqlserver20 ...

最新文章

  1. linux部署vue项目_Vue项目部署的最佳实践
  2. HDU - 7072 Boring data structure problem 双端队列 + 思维
  3. [css] 为什么说对opacity进行动画要比box-shadow进行动画性能更好呢?
  4. 吴恩达《机器学习》学习笔记十——神经网络相关(2)
  5. 鸿蒙系统对手机性能的提升,鸿蒙OS手机版再爆新特性,流畅度和性能大幅提升,用户评价很高...
  6. 点云标可视化+标注软件
  7. 腾讯云域名购买和域名解析教程
  8. 匈牙利算法--任务分配
  9. web前端开发面试题(三)
  10. Soul App 高管被捕,恶意举报导致竞品被下架
  11. nlohmann json使用
  12. 你的电脑或移动设备不支持Miracast
  13. Guava学习笔记-Splitter
  14. 带你了解IT互联网行业程序员岗位有些什么类型?
  15. 高德地图交通态势爬取并存入MySQL数据库
  16. Android获取局域网所有设备的ip地址
  17. 实验一:Java程序的编辑、编译和运行(输入、输出)
  18. c语言api获取百度地图,H5调用百度地图API获取地理位置
  19. 火爆的keychron机械键盘,你还没有入手?【重点:附键盘选购建议】
  20. html页面证书过期,网页上的完全证书过期过失效怎么处理

热门文章

  1. word之八大文本替换技巧
  2. pytorch中上采样的实现
  3. DWZ中navTab使用解析
  4. c python 传参数 数组_python函数传递数组参数吗
  5. 深度学习的实用层面 —— 1.5 为什么正则化可以减少过拟合
  6. matlab中关于程序运行的快捷键
  7. ASUS K401L安装Windows8.1注意事项
  8. CentOs基础操作指令(压缩、定时任务调度)
  9. 项目管理随感-项目管理是什么?
  10. android6.0关机动画,安卓系统修改开机动画,关机动画