今天在项目中遇到动态拼sql的语句,

语句如下:

v_sql := 'update Table_Test t '

||' set t.field1 = ''' || 变量1 || ''','  -- v_BalRuleID || v_BalanceSeq || ''','

||' t.field2 = ''' || 变量2 || ''','

||' t.field3 = ''' || 变量3 || ''','

||' t.field4 = 1,'

||' t.field5 = ' || 变量4

||' where t.field6 = ''' || 变量5 || ''''

||'  and  INSTRb( '''|| 变量6 ||''',t.field7 ) >0 ';

execute immediate v_sql;

于是对其中多个连续的单引号感到奇怪,google后,终于恍然大悟,下面把总结贴出来:

在ORACLE中,单引号有两个作用,一是字符串是由单引号引用,二是转义。单引号的使用是就近配对,即就近原则。而在单引号充当转义角色时相对不好理解。
  1、从第二个单引号开始被视为转义符,如果第二个单引号后面还有单引号(哪怕只有一个)。

SQL> SELECT '''' FROM DUAL;
 
''
--
'
 
为了证实结果是被第二个单引号转义的第三个单引号(既:SELECT '''' FROM DUAL;),我们做如下两个测试:
 
SQL> SELECT ''' FROM DUAL;
ERROR:
ORA-01756: 括号内的字符串没有正确结束
 
 
相信大家对这样的错误不陌生吧
 
SQL> SELECT 'SDLF FROM DUAL;
ERROR:
ORA-01756: 括号内的字符串没有正确结束

也就是说,当第二个单引号充当转义角色,第三个单引号被转义,(既:select '' ' from dual;)自然就缺少与第一个单引号匹配的单引号了,出现了孤立的单引号
下面的两个实验就更加支持了上面的结论。
 
SQL> SELECT ' '' ' FROM DUAL;
 
''''
------
'
 
SQL> SELECT '' '' FROM DUAL;
SELECT '' '' FROM DUAL
          *
ERROR 位于第 1 行:
ORA-00923: 未找到预期 FROM 关键字
 
 
 
对于第一个:SELECT ' '' ' FROM DUAL;
对于第二个:不存在转义。
 
上面的这两个实验其实也是单引号转义与非转义的一个性质:转义是密集的,也就是说,如果单引号出现在转义的位置上,而该单引号后面紧跟(紧跟的定义为:两个单引号之间是零距离的)的不是单引号,这个时候单引号就不在充当转义的角色,而是与它前面的配对。
 
2、连接符‘||’导致了新一轮的转义:连接符号‘||’左右的单引号没有任何的关系,除非‘||’是作为字符串的一部分(这在动态SQL中很常见)。

SQL> SELECT 'ORACLE'||'''' FROM DUAL;
 
'ORACLE'||''
----------
ORACLE'
 个人理解,'ORACLE'||'''' 后面的“''''”应该认为是一个字符串(即前后单引号,中间是“''”串,而中间又是密集单引号,因此第一个为转义功能)
SQL> SELECT 'ORACLE''''' FROM DUAL;
 
'ORACLE'''''
------------
ORACLE''

对于第一个,前两个单引号配对,后面四个单引号按照上面的第一条原则分配,既:SELECT 'ORACLE'||'''' FROM DUAL;
对于第二个,由于第二个单引号后面存在单引号,所以就不与第一个配对,而是充当了转义的角色。既:SELECT 'ORACLE''''' FROM DUAL;

ORACLE 动态SQL中的多个单引号相关推荐

  1. ORACLE动态sql在存储过程中出现表或视图不存在的解决方法

    ORACLE动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN   ...

  2. oracle中execute函数,Oracle 动态SQL execute immediate写法 zt

    Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者.试验步骤如下: 1. DDL 和 DML/*** DDL ***/ begin EXEC ...

  3. oracle 更新sysdate,如何使用sysdate更新日期列,包括动态sql中的时间戳

    Lalit Kumar .. 9 我已经尝试使用to_date(to_char(sysate)),但缺少时间戳 这样做是没有意义的. 为什么PL/SQL执行这么简单的任务.在纯SQL中执行此操作.UP ...

  4. Oracle 动态SQL语句

    Oracle 动态SQL语句     EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包.  它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块 ...

  5. oracle怎么优化动态sql语句,oracle动态sql语句处理

    动态SQL语句处理:根据要处理的sql语句的作用不同,可以使用三种不同类型的动态sql方法:使用execute immediate语句可以处理包括ddl(create.alter和drop).DCL( ...

  6. mybatis动态sql中where标签的使用

    where标记的作用类似于动态sql中的set标记,他的作用主要是用来简化sql语句中where条件判断的书写的,如下所示: <select id="selectByParams&qu ...

  7. [网摘]动态SQL中set与select对变量赋值的影响

    在动态SQL中,存在着多种对字符变量赋值的方法.其中set和select使用的朋友最多.对于像我一样的小鸟来说,可能只是会用这两个方法而已,并没有真正理解这两个方法的真正内涵.我个人的理解是这样的:s ...

  8. oracle怎么变为整数,如何在Oracle 11g SQL中为char添加整数?(How to add integers to char in Oracle 11g SQL?)...

    如何在Oracle 11g SQL中为char添加整数?(How to add integers to char in Oracle 11g SQL?) 是否可以在PL / SQL块中做这样的事情: ...

  9. sql动态sql给变量复值_在动态SQL中使用变量

    sql动态sql给变量复值 Before we delve into these SQL concepts, note that I like to do all my development in ...

最新文章

  1. python windows编程_在Windows下配置Python编程学习环境
  2. 3.Tomact部署webapp
  3. java读取文件替换字符,跳槽薪资翻倍
  4. HttpWatch是强大的网页数据分析工具
  5. ffmpeg 如何把左右声道_耳机里的乾坤 | 左右声道?耳返?这些耳机常识,爱听音乐的你一定不会错过...
  6. ssh(Spring+Spring mvc+hibernate)——Dept.hbm.xml
  7. MATLAB矩阵对称旋转
  8. windows 下安装 elasticsearch 以及 head 管理插件
  9. 一文了解linux内核,一文了解Linux的系统结构
  10. Security+ 学习笔记3 威胁情报
  11. kali--linux--安装截图工具scrot
  12. 设计模式-12-命令模式
  13. 计算机代数与数论pdf,计算机代数及数论(maple).pdf
  14. endnotex9切换中文_EndNoteX9常用方法汇总
  15. 推荐免费下载380套大型商业源码
  16. 简单的逻辑思维题分享1(附详细答案)
  17. python实部和虚部_Python复数表示表示和计算
  18. 清华EMBA课程系列思考之九 -- 中国经济前沿问题解读
  19. 【PCL自学:目录】PCL简介及主要功能模块介绍 (持续更新)
  20. 解题:CF949D Curfew

热门文章

  1. 2000坐标系xy坐标几位_2000国家大地坐标系转换演示及实践应用专题培训研讨班...
  2. Thinkpad上安装Ubuntu相关事项
  3. For each...in / For...in / For...of 的解释与例子
  4. super() 函数??
  5. Elasticsearch环境准备(一)
  6. python数据处理与机器学习
  7. [Leetcode Week13]Palindrome Partitioning
  8. css动画之旅--弹性菜单效果
  9. 有趣的linux指令
  10. Swift之父Chris Lattner将从Apple离职,加入特斯拉