在C中嵌入SQL,是否有办法使表名变量?

时间:2016-06-07 13:38:24

标签: c db2 embedded-sql

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

1 个答案:

答案 0 :(得分:2)

对于变量表名,您需要PREPAREEXECUTE一个动态SQL语句,您在其中CONCAT将表名称放入语句中。

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

但我认为首先将10M行插入100个较小的表中,然后从较小的表插入主表中是没有优势的。

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

您没有提到您正在使用的DB2平台和版本,可能有批量加载过程可供选择。