0

PowerBuilder 10.5 と Oracle 7 データベースを使用しています。

私の問題は次のとおりです。ユーザーはプログラムに入り、データを取得して、クライアントが持っている金額、住んでいる都市、およびその他のデータを示す多数の行(1000としましょう)を含むデータウィンドウを取得します. 次に、ユーザーは関心のあるすべての行 (約 500 行) をクリックし、2 番目のデータウィンドウでそれらをフィルタリングします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")

ご覧のとおり、フラグを設定したすべてのクライアントを取得し、それらのクライアント コードを 1 つの変数に入れています。これを 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   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 に答える
0

ヒント

パフォーマンスと最適化は別として、あなたが持っているような複数の SELECT ステートメントを作成できますが、各ステートメントは 1000 より小さいサイズの文字列を使用します。次に、次のいずれかを実行できます。

A- ステートメントをループで発行するか、

B- SELECT.....UNION SELECT....などを使用します。これにより、サイズの問題が解決されるはずです。ここでも、巨大な SQL 文字列がある場合、UNION アプローチで問題が発生する可能性があります。

于 2013-11-07T11:07:25.017 に答える