天天看點

PB 動态修改資料視窗DW的SQL

在PB中動态修改資料視窗DW的SQL語句方法注意事項

資料庫應用程式通常進行一項确定的工作,在編寫和編譯時就可以确定完整的SQL語句,但是在編譯時不能确定SQL語句的具體格式和參數時,隻能在程式運作中構造SQL語句,需要使用動态SQL語句。以Foramat 4 動态SQL語句為例,使用格式如下:

DECLARE Cursor | Procedure  

     DYNAMIC CURSOR | PROCEDURE  FOR DynamicStagingArea ; 

     PREPARE DynamicStagingArea FROM SQLStatement  {USING TransactionObject} ; 

     DESCRIBE DynamicStagingArea  INTO DynamicDescriptionArea ;

     OPEN DYNAMIC Cursor | Procedure 

     USING DESCRIPTOR DynamicDescriptionArea} ; 

     EXECUTE DYNAMIC Cursor | Procedure 

     USING DESCRIPTOR DynamicDescriptionArea ;

     ETCH Cursor | Procedure 

     USING DESCRIPTOR DynamicDescriptionArea ;

     CLOSE Cursor | Procedure ;

     —在使用動态SQL語句時,需準備DynamiccStagingArea 對象(全局對象SQLSA)和DynamicDescriptAera對象(全局對象SQLDA)。定義遊标或過程,讀取prepare語句中的SQL語句以及語句中說明的參數和類型,執行Fetch語句後,調用相關的函數逐條讀取并處理檢索結果。動态SQL雖然能夠在程式運作中構造SQL語句,但在實際中較少使用。若select語句中的結果序列一定,可以通過重新指定datawindow對象的select語句的文法,達到動态修改SQL語句的功能。運用 首先用Desccribe 函數讀取datawindow對象的select語句,用replace等函數修蓋出符合要求的select語句,并且可以增加檢索條件,在用setsqlselect函數為datawindow控件指定修改後的select語句。

代碼樣例:

string sql_string,sql_new

long start_pos = 1

string old_str //select 語句中需要替換的字元串

string new_str //替換字元串 可以是結構相同的表名

new_str = ‘xt_xmfl_dict’

old_str = ‘XT_FB_DICT’

sql_string = dw_1.describe(“datawindow.table.select” )

start_pos = pos(sql_string,old_str,start_pos)

do while start_pos > 0

sql_string = replace(sql_string,start_pos,len(old_str),new_str)

start_pos = pos(sql_string,old_str,start_pos+len(new_str))

loop

if pos(sql_new,‘where’) = 0 then

sql_new =sql_string +" where bm =‘1’"

end if

if dw_1.setsqlselect(sql_new) = -1 then

messagebox(‘錯誤’,’!!!’)

return

end if

dw_1.settransobject(SQLCA)

dw_1.retrieve( )

使用selsqlseelct 有一定的妖氣護額限制,更改後的select語句select語句在結構上必須與原先的語句比對,在執行setsqlseelct函數之前必須調用settrans或settransobject函數設定datawindow控件的内部事務對象。另外,datawindow對象的資料源必須是一個不帶參數的select語句,如果需要使用參數檢索,可以在程式中修改sql select語句。

PB