0

我有超过 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 中的大表?

4

1 回答 1

2

PREPARE对于变量表名,您需要EXECUTE一个动态 SQL 语句,在该语句中您已将CONCAT表名放入语句中。

通常动态 SQL 构建的连接文本是一个坏主意,因为它对 SQL 注入开放。但是,由于您没有处理来自用户的输入,并且这是处理变量表名的唯一方法,所以您应该没问题。

但我认为先将 10M 行插入 100 个较小的表,然后从较小的表插入主表没有任何好处。

直接进入决赛桌;每 1000 行左右提交一次;因为您可能不希望一次提交中有 10M 行。

您没有提及您正在使用的 DB2 平台和版本,可能有可用的批量加载过程作为替代方案。

于 2016-06-07T14:05:42.573 回答