创建一个UDF,接受CSV字符串,并在DB2中返回一个表,以便在存储过程中用于批量插入
我对数据库很陌生。。这就是问题所在 我需要在表中进行大容量插入。作为存储过程的输入,我得到一个如下所示的字符串创建一个UDF,接受CSV字符串,并在DB2中返回一个表,以便在存储过程中用于批量插入,db2,user-defined-functions,Db2,User Defined Functions,我对数据库很陌生。。这就是问题所在 我需要在表中进行大容量插入。作为存储过程的输入,我得到一个如下所示的字符串 "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, 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
您可以通过创建一个表函数并实现该功能来实现这一点 我用Java做这类事情 您也只能使用SQL: 这是我建议使用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());
}
}
我写了一篇解释如何使用表函数的博客:哪个版本的DB2?这些数据来自哪里?您应该如何判断列的数据类型是什么?数据是否应该被持久化,而不仅仅是临时表?有多少行?DB2版本是DB2/NT64 9.1.4。数据来自C++应用程序。第一列为int(索引列),其余为Varchar。我需要在存储过程中使用该表,但我希望能够在实际存储它之前对其进行一些处理。行可能是不确定的。。。我想搜索“;”来定义行。和“,”要定义columnsHmm,您可以在存储过程中使用循环将其拆分,尽管我个人更喜欢在应用程序层进行拆分,然后阻止将其上载到数据库中的
全局临时表
,如果您有大量行,您可能可以使用load命令上载整个文件—您可能需要稍微重新格式化它。或者,是否可能以某种方式将表作为参数传递给要插入的SP?在C++代码中创建表并发送thouth.xxx x0,循环和全局临时表对我来说是最好的。