Oracle動態SQL的拼裝要領

2021-06-22 14:20:38 字數 1789 閱讀 2644

oracle的動態sql語句用起來很方便,但其拼裝過程太煩人。尤其在拼裝語句中涉及到date型別欄位時,拼裝時要加to_char先轉換成字元,到了sql中又要使用to_date轉成date型別和原字段再比較。 

**** www.akdy.cn

例如這樣乙個sql: 

select '*****====  and (t.created>=to_date('''||to_char(sysdate,'yyyy-mm-dd')||''',''yyyy-mm-dd'') and t.created< to_date('''||to_char(sysdate+1,'yyyy-mm-dd')||''',''yyyy-mm-dd''))' from dual; 

它就是將sysdate轉成字串,再在生成的sql中將字串轉換成date。 

拼裝出來的結果如下: 

*****====  and (t.created>=to_date('2012-11-08','yyyy-mm-dd') and t.created< to_date('2012-11-09','yyyy-mm-dd')) 

字串2012-11-08是我們使用to_char(sysdate,'yyyy-mm-dd')生成的,語句中涉及到的每乙個單引號,都要寫成兩個單引號來轉義。 

雖然拼裝過程很煩人,但只要掌握好三點,就應能拼裝出能用的sql語句。 

一,先確定目標。應保證拼裝出來的sql應該是什麼樣子,然後再去配置那個動態sql 

二,拼裝sql的時候,所有使用連線符||連線的物件都應是varchar2型別,這種型別的物件以單引號開頭,以單引號結尾。數字會自動轉,但date需要我們手工使用to_char函式轉。 

三,遇到有引號的,就寫成兩個單引號。 

如 ' i am a sql developer '' '||v_name||' '' in china. telephone is '||v_number||' .' 

v_name是字元型的,所以拼裝它是需要前後加單引號。 

這種轉換很煩人,但從10g開始有乙個新功能,可以讓人不用這麼煩。它就是q'[***xx]' 

示例如下: 

select q'[ i'm a sql developer ' ]'||to_char(sysdate,'yyyy')||q'[' in china. telephone is ]'||1990||'.'  from dual; 

結果如下: 

result** 

i'm a sql developer '2012' in china. telephone is 1990. 

i'm使用乙個單引號在q''中就可以。 

to_char(sysdate,'yyyy')轉成的是2012,前後是要加單引號的。所以在q'[*** ']'的結尾加了乙個單引號。 

這樣就使得我們不用想以前那樣使用 ''''表示乙個單引號了。 

簡而言之,掌握這三點,就應該能拼裝出能用的sql。至於如果使用繫結變數輸入輸出,則需要使用into using關鍵字。 

set serveroutput on; 

declare 

incoming date:=sysdate-10; 

outgoing int; 

begin 

execute immediate 'select count(*) from user_objects where created > :incoming' into outgoing using incoming ; 

dbms_output.put_line(' count is: ' || outgoing); 

end; 

/

動態SQL拼裝技巧

儲存過程裡有時候需要根據不同的條件拼裝動態sql,比如下圖是乙個簡單的sql語句拼裝函式 執行結果如下 plsql的字串連線時,需要用2個單引號表示1個單引號,比如上例中的to date函式裡面用到的日期模式。實際應用中可能會拼裝比這個複雜很多倍的動態sql,特別是當引號比較多的時候,對於拼裝出來的...

oracle 中的動態 SQL

在 pl sql 塊中,可以使用 ddl 語句和事物控制語句,但還有很多語句不能直接在 pl sql 中執行,比如 ddl,這些語句可以使用動態 sql 來執行。connected to oracle database 11g enterprise edition release 11.2.0.1....

Oracle動態SQL語句

在使用odp.net進行oracle程式設計時,有時候sql語句非常複雜,需要採用動態構造查詢語句的情況,有兩種方法可以構造動態的sql語句,並執行返回結果集。1 在資料訪問層構造sql語句 例如下面的語句,將構造完整的sql語句賦值給commandtext,再傳遞到資料庫進行執行,返回結果集。lo...