我需要将超过10,000,000行插入到一个表中。考虑到行数很大,我想首先将大表拆分为100个小表,然后从table_001插入table_100。我期望这样做:
int main(){
int i = 0;
int j = 0;
int k = 0;
EXEC SQL BEGIN DECLARE SECTION;
char *buff[100] = { 0 };
EXEC SQL END DECLARE SECTION:
while( i < 100 ){
buff[i] = malloc(12);
sprintf(buff[i],"table_%3.3d",i+1);
i++;
}
i = 0;
while( i < 10000000 ){
EXEC SQL INSERT INTO :buff[j] VALUES(:v1,:v2);/* v1 and v2 is not important here, so I eliminate the code generate the v1 and v2 */
k++;
if( 1000000 == k ){
k = 0;
j++;
}
}
return 0;
}
但似乎表名不可变,有没有类似的方法来做这些?或者有没有其他好方法来处理嵌入式SQL中的大表?
答案 0 :(得分:2)
对于变量表名,您需要PREPARE
和EXECUTE
一个动态SQL语句,您在其中CONCAT
将表名称放入语句中。
正常情况下,动态SQL构建的连接文本是一个坏主意,因为它对SQL注入是开放的。但是,由于您没有处理来自用户的输入,并且这是处理变量表名的唯一方法,您应该没问题。
但我认为首先将10M行插入100个较小的表中,然后从较小的表插入主表中是没有优势的。
直接进入决赛桌;每1000行左右;因为你可能不希望在一次提交中有10M行。
您没有提到您正在使用的DB2平台和版本,可能有批量加载过程可供选择。