0

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

有什么想法、建议吗?

4

2 回答 2

0

暗示

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

A- 在循环中发出语句或

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

于 2013-11-07T11:07:25.017 回答
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
于 2013-11-07T11:54:05.623 回答