在 C 中嵌入 SQL ,有没有办法使 table name 变量?
Embedded SQL in C , is there a way making table name variable?
我有超过 10,000,000 行需要插入一个 table。考虑到行数较多,想先把大的table拆分成100个小的table,然后从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;
}
但是table这个名字好像不能变,有没有类似的方法呢?或者有没有其他好的方法来处理嵌入式 SQL 中的大 table?
对于变量 table 名称,您需要 PREPARE
和 EXECUTE
动态 SQL 语句,其中您 CONCAT
table name 写入语句。
通常动态 SQL 构建串联文本是一个坏主意,因为它对 SQL 注入开放。但是,由于您不是在处理来自用户的输入,而且这是处理变量 tablename 的唯一方法,所以您应该没问题。
但我认为先将 1000 万行插入 100 个较小的 tables,然后再从较小的 tables 插入主行没有任何好处。
直接插入最后一个即可table;每 1000 行左右提交一次;因为您可能不希望在一次提交中有 1000 万行。
您没有提及您使用的 DB2 平台和版本,可能有可用的批量加载过程作为替代方法。
我有超过 10,000,000 行需要插入一个 table。考虑到行数较多,想先把大的table拆分成100个小的table,然后从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;
}
但是table这个名字好像不能变,有没有类似的方法呢?或者有没有其他好的方法来处理嵌入式 SQL 中的大 table?
对于变量 table 名称,您需要 PREPARE
和 EXECUTE
动态 SQL 语句,其中您 CONCAT
table name 写入语句。
通常动态 SQL 构建串联文本是一个坏主意,因为它对 SQL 注入开放。但是,由于您不是在处理来自用户的输入,而且这是处理变量 tablename 的唯一方法,所以您应该没问题。
但我认为先将 1000 万行插入 100 个较小的 tables,然后再从较小的 tables 插入主行没有任何好处。
直接插入最后一个即可table;每 1000 行左右提交一次;因为您可能不希望在一次提交中有 1000 万行。
您没有提及您使用的 DB2 平台和版本,可能有可用的批量加载过程作为替代方法。