[英]How to retrieve a large number of specified rows
我正在使用PowerBuilder 10.5和Oracle 7數據庫。
接下來的問題是:用戶進入程序,檢索數據並獲取一個DataWindow,該窗口具有大量行(比如說1000),顯示了客戶的錢數,所居住的城市以及其他一些數據。 然后,用戶單擊他感興趣的所有行(大約500條),並在第二個DataWindow中對其進行過濾,將其DW_1
。 現在,他想要一張Excel工作表,該表可以給出按客戶居住城市分組的所有資金的總和。 要記住的重要一點是,我只希望為用戶之前標記的客戶端求和。 所以這就是我在代碼中所做的:
String ls_s,ls_client,ls_clicked_client, ls_sql
Long ll_i
ls_s='';ls_client='';ls_clicked_client='';
FOR ll_i= 1 TO DW_1.RowCount()
ls_s=DW_1.GetItemString(ll_i, "client")
IF ll_i<DW_1.RowCount() THEN
ls_client+="'"+ls_s+"',"
ELSEIF ll_i=DW_1.RowCount() THEN
ls_clicked_client+=ls_client+"'"+ls_s+"'"
END IF
NEXT
ls_sql="SELECT city, SUM(amount) sum_amount"&
+"FROM("&
+"SELECT city, amount"&
+"FROM table1 T1 WHERE amount+0>0 AND client IN ( "+ls_clicked_client+"))"&
+"GROUP BY city"
DW_1.SetSqlSelect(ls_sql)
DW_1.Retrieve()
w_window.SetMicrohelp(String(DW_1.RowCount()))
DW_1.saveas("excel.xls")
如您所見,我將所有已標記的客戶機放入客戶機變量中,並將其放入一個變量中,然后將其用作SQL IN函數中的參數。 之后,我使用標准的saveas方法。
這很有效,直到我挑選出更多的行然后才可以采取行動:一遍遍就得到了ORA 01795: max number of expressions in a list is 1000
。 那是我的問題:如果用戶選擇了太多的客戶端,這將失敗。
我也嘗試過使用INSTR
函數,但對大量選定的行也做不到-我得到ORA 01460: unimplemented or unreasonable conversion requested
提示:似乎試圖將字符串過多傳遞給綁定變量值4000字節會導致其崩潰。
因此,基本上我在某種程度上無法滿足我的要求。 而且我不知道如何在沒有使用ls_sql變量編寫的SQL代碼的情況下實現此目的。 如果應該在excel工作表中僅提供DW_1
某些行,那么我將使用OLE對象,但我看不到如何為如此大量的指定客戶端獲取按城市分組的金額總和。
有什么想法,建議嗎?
暗示
除了性能和優化之外,您可以構建多個SELECT語句,就像您擁有的語句一樣,但是每個語句使用的字符串的大小小於1000。然后,您可以:
A-循環發出語句或
B-使用SELECT ..... UNION SELECT .... etc。 這應該克服大小問題。 同樣,如果您的SQL字符串很大,則UNION方法可能會遇到問題。
您可以將用戶選擇的記錄插入到另一個表中,然后發出如下選擇:
SELECT T1.city, SUM(T1.amount) sum_amount
FROM table1 T1
WHERE T1.amount > 0
AND T1.client IN ( select T2.id from your_new_table T2 )
GROUP BY T1.city
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.