使用SQL生成SQL语句时单引号的转义处理之q'{}'方法 _MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1595 | 回复: 0   主题: 使用SQL生成SQL语句时单引号的转义处理之q'{}'方法         下一篇 
derek
注册用户
等级:中校
经验:1550
发帖:209
精华:0
注册:2011-7-21
状态:离线
发送短消息息给derek 加好友    发送短消息息给derek 发消息
发表于: IP:您无权察看 2015-6-18 10:52:47 | [全部帖] [楼主帖] 楼主

在使用SQL生成SQL技术完成维护任务的过程中,会遇到类似单引号这样的字符需要转义,给脚本编写带来了些许的麻烦。
当一句话中出现多个单引号,频繁转义将非常麻烦,而且会极大的降低语句的可读性,我们可以使用q'{}'将需要转义的字符串放到两个大括号之间的方法实现单引号的转义。演示如下。

1.创建四张测试表

sec@ora10g> create table t1 (x int);
Table created.
sec@ora10g> create table t2 (x int);
Table created.
sec@ora10g> create table t3 (x int);
Table created.
sec@ora10g> create table t4 (x int);
Table created.


2.使用普通单引号转义方法实现生成表分析语句的方法如下

sec@ora10g> SET LIN 300
sec@ora10g> SET HEAD OFF
sec@ora10g> select    'EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'
2        ''''
3        OWNER
4        ''''
5        ',TABNAME=>'
6        ''''
7        TABLE_NAME
8        ''''
9        ',METHOD_OPT=>'
10        ''''
11        'FOR ALL COLUMNS SIZE 254'
12        ''''
13        ',DEGREE=>4,CASCADE=>TRUE);'
14   from DBA_TABLES
15  where WNER = 'SEC';
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SEC',TABNAME=>'T1',METHOD_OPT=>'FOR ALL COLUMNS SIZE 254',DEGREE=>4,CASCADE=>TRUE);
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SEC',TABNAME=>'T2',METHOD_OPT=>'FOR ALL COLUMNS SIZE 254',DEGREE=>4,CASCADE=>TRUE);
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SEC',TABNAME=>'T3',METHOD_OPT=>'FOR ALL COLUMNS SIZE 254',DEGREE=>4,CASCADE=>TRUE);
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SEC',TABNAME=>'T4',METHOD_OPT=>'FOR ALL COLUMNS SIZE 254',DEGREE=>4,CASCADE=>TRUE);


3.使用q'{}'方法实现单引号转义

sec@ora10g> SET LIN 300
sec@ora10g> SET HEAD OFF
sec@ora10g> select 'EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'
2 q'{'}'
3 OWNER
4 q'{'}'
5 ',TABNAME=>'
6 q'{'}'
7 TABLE_NAME
8 q'{'}'
9 ',METHOD_OPT=>'
10 q'{'}'
11 'FOR ALL COLUMNS SIZE 254'
12 q'{'}'
13 ',DEGREE=>4,CASCADE=>TRUE);'
14 from DBA_TABLES
15 where WNER = 'SEC';
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SEC',TABNAME=>'T1',METHOD_OPT=>'FOR ALL COLUMNS SIZE 254',DEGREE=>4,CASCADE=>TRUE);
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SEC',TABNAME=>'T2',METHOD_OPT=>'FOR ALL COLUMNS SIZE 254',DEGREE=>4,CASCADE=>TRUE);
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SEC',TABNAME=>'T3',METHOD_OPT=>'FOR ALL COLUMNS SIZE 254',DEGREE=>4,CASCADE=>TRUE);
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SEC',TABNAME=>'T4',METHOD_OPT=>'FOR ALL COLUMNS SIZE 254',DEGREE=>4,CASCADE=>TRUE);


单引号转义成功。针对上面的例子使用q'{}'方法略显笨拙!相比普通转义方法没有太大的优势。
再看一例。

4.使用q'{}'方法简化多引号场景
以在SQL*Plus中显示字符串“I'm Secooler. I'm Andy. I'm Shengwen.”为例。
1)使用普通单引号转义方法

sec@ora10g> select 'I''m Secooler. I''m Andy. I''m Shengwen.' from dual;
I'm Secooler. I'm Andy. I'm Shengwen.


2)使用q'{}'方法转义单引号

sec@ora10g> select q'{I'm Secooler. I'm Andy. I'm Shengwen.}' from dual;
I'm Secooler. I'm Andy. I'm Shengwen.


此时q'{}'对单引号的转义方法可以保留语句的全部内容,不会对阅读字符串造成影响。

5.小结
  在字符串中出现少量单引号时,我们可以使用普通的转义方法处理,这样会更加高效;当字符串中出现大量的单引号时,便可以使用这种q'{}'方法来实现转义。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论