如何检索大量指定的行

时间:2013-11-06 22:19:27

标签: sql oracle powerbuilder

我正在使用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对象,但我不知道如何获得按城市分组的数量总和如此大量的指定客户端。

有什么想法,建议吗?

2 个答案:

答案 0 :(得分:0)

提示

除了性能和优化之外,您可以构建多个SELECT语句,例如您拥有的语句,但每个语句都使用大小小于1000的字符串。然后您可以:

A-循环或

发布语句

B-使用SELECT ..... UNION SELECT ....等。这应该克服尺寸问题。再次,如果你有一个巨大的SQL字符串,你可能会遇到UNION方法的问题。

答案 1 :(得分:0)

您可以将用户选择的记录插入另一个表中,然后发出类似这样的选择:

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