【轉義】使用SQL生成SQL語句時單引號的轉義處理之q'{}'方法

lovestanford發表於2014-07-11
  在使用SQL生成SQL技術完成維護任務的過程中,會遇到類似單引號這樣的字元需要轉義,給指令碼編寫帶來了些許的麻煩。
  一般處理單引號轉義是透過“兩個單引號表示一個單引號”的規則完成轉義。這種方法在在文章《【轉義】使用SQL生成SQL語句時單引號的轉義處理》(http://space.itpub.net/519536/viewspace-628186)中已經給出描述和應用。

  當一句話中出現多個單引號,頻繁轉義將非常麻煩,而且會極大的降低語句的可讀性,有沒有更簡便的方法實現單引號的轉義?答案是肯定的!

  我們可以使用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'{}'方法來實現轉義。

Good luck.

secooler
11.05.16

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21754115/viewspace-1216953/,如需轉載,請註明出處,否則將追究法律責任。

相關文章