【轉義】使用SQL生成SQL語句時單引號的轉義處理之q'{}'方法
在使用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 --
一般處理單引號轉義是透過“兩個單引號表示一個單引號”的規則完成轉義。這種方法在在文章《【轉義】使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【轉義】使用SQL生成SQL語句時單引號的轉義處理SQL
- 通過xml處理sql語句時對小於號與大於號的處理轉換XMLSQL
- oracle動態sql語句處理(轉)OracleSQL
- Oracle q' 簡化單引號轉義介紹Oracle
- Oracle一個SQL語句的處理過程(轉)OracleSQL
- SQL查詢的轉義方法(一)SQL
- SQL查詢語句使用 (轉)SQL
- url地址中 "&" "/"等符號的轉義處理(轉)符號
- 單引號在動態SQL中的處理SQL
- 自定義註解例項實現SQL語句生成SQL
- 簡單SQL語句小結(轉)SQL
- 查詢處理死鎖會話的sql語句(轉貼)會話SQL
- 精妙SQL語句 (轉)SQL
- 在ORACLE SQL語句中,單引號和雙引號的使用OracleSQL
- SQL語句的處理過程SQL
- SQL語句中的單引號與雙引號SQL
- 使用SQL語句獲取SQLite中的表定義SQLite
- informix SQL語句斷點定義ORMSQL斷點
- 【PL/SQL】使用變數傳遞方法生成表更名的SQL語句SQL變數
- 使用預處理PreparedStatement執行Sql語句SQL
- SQL語句優化方法30例(轉)SQL優化
- 【轉】LINQ to SQL語句(1)之WhereSQL
- SQL語句的處理過程修正SQL
- [轉]SQL Server 2000定時執行SQL語句SQLServer
- 動態SQL語句 (轉)SQL
- 使用 pymysql 的時候如何正確的處理轉義字元MySql字元
- Oracle SQL精妙SQL語句講解(轉)OracleSQL
- 定時生成分月表sql語句SQL
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- Oracle 行轉列的sql語句OracleSQL
- 【Tips】使用SQL生成外來鍵的SQL建立語句SQL
- 有關PHP、HTML單引號、雙引號轉義以及轉成HTML實體的那些事!PHPHTML
- Sybase及SQL Anywhere SQL語句小結(轉)SQL
- SQL語句優化(轉載)SQL優化
- TSM裡面的sql語句(轉)SQL
- SQL查詢語句精華使用簡要(轉)SQL
- zsh 命令在 alias 中如何轉義 ' 字元(單引號)字元
- ASP中巧用Split()函式生成SQL查詢語句 (轉)函式SQL