我正在使用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对象,但我不知道如何获得按城市分组的数量总和如此大量的指定客户端。
有什么想法,建议吗?
答案 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