繁体   English   中英

如何检索大量指定的行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM