2012-03-22 1 views
0

私はデータベースにとって非常に新しいです。UDFを作成してCSV文字列を受け取り、バルク挿入用のストアドプロシージャで使用するテーブルをDB2に返します。

テーブルに一括挿入する必要があります。

"1, abc, 123.45; 2, def, 678.90; 3, ghi, 332.99;" 

それはあなたが作成することによって、それを行うことができます

Column 1 Column 2 Column 3 
1   abc  123.45 
2   def  678.90 
3   ghi  332.99  
+0

どのバージョンのDB2ですか?このデータはどこから来ていますか?列のデータ型がどうなっているのか、どうしたら分かりますか?テンポラリテーブルとは対照的に、データは永続化されるはずですか?何行ですか? –

+0

DB2バージョンはDB2/NT64 9.1.4です。データはC++アプリケーションから来ています。最初の列はint(インデックス列)restはVarcharになります。私はストアドプロシージャのテーブルを使用する必要がありますが、私は実際にそれを格納する前にいくつかの処理を行うことができるようにしたいと思います。行が不定である可能性があります...私は ";"を検索したい行を定義します。そして、 "、"を定義する列 – Anand

+1

ええと、あなたはストアドプロシージャでループを使って分割することができますが、私は個人的にはアプリケーション層でそれをやりたいのですが、それをデータベースにブロックしてGLOBAL TEMPORARY TABLE '本当にたくさんの行がある場合は、ファイル全体をアップロードするためにloadコマンドを使うことができます。おそらく、それを少しだけ再フォーマットする必要があります。 –

答えて

0

のように見えるテーブルを返しますどのUDFを作成することが可能です下に示すようにストアドプロシージャへの入力として、私は文字列を取得しますテーブル機能を実装し、その機能を実装します。

私はJavaを使用してそのようなことを行います。 http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.sqlpl.doc/doc/t0053768.html

これは私がJavaを使用して提案している例です:

public void cvsToTable(String csv/*val1*/, int val2, String val3, double val4) 
     throws Exception { 
switch (getCallType()) { 
case SQLUDF_TF_FIRST: 
    break; 
case SQLUDF_TF_OPEN: 
    // Creates a tokenizer or something similar 
    st = new StringTokenizer(csv, ";"); 
    break; 
case SQLUDF_TF_FETCH: // This is called each time for each row. 
    // Iterates over the set of tokens (each row) 
    if (st.hasMoreTokens()) { 
     String row = st.nextToken(); 
     StringTokenizer values = new StringTokenizer(row, ","); 
     int i = 2; 
     int MAX = 5; 
     while (values.hasMoreTokens()) { 
      String record = values.nextToken(); 
      if (i >= MAX) { 
       i = 2 
      // Sets the record in the answer. 
      set(i, record); 
      i++; 
     } 
    } else { 
     // No more rows 
     setSQLstate("02000"); 
    } 
    break; 
case SQLUDF_TF_CLOSE: 
    break; 
case SQLUDF_TF_FINAL: 
    break; 
default: 
    throw new Exception("Unexpected call type of " + getCallType()); 
} 
} 

私は表関数を使用する方法について説明しブログに書いた:http://angocadb2.blogspot.com/2012/02/accediendo-tweeter-desde-db2-table.htmlをあなたはまた、唯一のSQLを使用することができます

http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.routines.doc/doc/c0009197.html

関連する問題