Создайте UDF, примите строку CSV и верните таблицу в DB2 для использования в сохраненном процессе для массовой вставки - PullRequest
0 голосов
/ 22 марта 2012

Я очень новичок в базах данных .. отсюда и вопрос.

Мне нужно сделать массовую вставку в таблицы. В качестве входных данных для сохраненного процесса я получаю строку, показанную ниже

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

Можно ли создать UDF, который будет возвращать таблицу, которая выглядит как

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

1 Ответ

0 голосов
/ 22 марта 2012

Это можно сделать, создав табличную функцию и реализовав эту функцию.

Я использую Java для таких вещей.

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

Вы также можете использовать только SQL: 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

...