gpt4 book ai didi

将主机结构数组转换为表

转载 作者:行者123 更新时间:2023-12-04 09:13:14 25 4
gpt4 key购买 nike

我正在尝试调整一段用 Pro*C 编写的大型代码,特别是瓶颈循环和其中的 UPDATE 语句。 for 循环 循环遍历“Host Structure array”,它可能包含几千条有时数百万条记录并且更新执行了太多次。更新可以在整个程序中更频繁地执行,但这需要对代码进行重大更改,我无权进行重大更改。

所以我有这样的东西

....
#define NULL_REF_NO 10
#define NULL_ERR 256
....
....
struct s_errors
{
char s_ref_id [NULL_REF_NO];
char s_ref_seq_no [NULL_REF_NO];
char s_err_msg [NULL_ERR];
};
....
....
struct s_errors *ps_errors = NULL;
....
....
/*The part below happens throughout the program to collect all errors*/
/*ls_ref_id, ls_ref_seq_no, and ls_err_msg are local variables of same data type. and i_curr_index is the array index variable*/

strcpy(ls_ref_id, ps_errors[i_curr_index].s_ref_id);
strcpy(ls_ref_seq_no, ps_errors[i_curr_index].s_ref_seq_no);
strcpy(ls_err_msg, ps_errors[i_curr_index].s_err_msg);

.....
/* At this point ps_error contains thousands or even millions of rows*/
/* The final part is to update all these rows back to the table like below*/
/* pl_err_count is a Global var which keeps track of the total number of records in the host structure array*/

int i_curr_index = 0;
char l_ref_id [NULL_REF_NO];
char l_ref_seq_no [NULL_REF_NO];
char l_err_msg [NULL_ERR];

for(i_curr_index = 0; i_curr_index < pl_err_count; i_curr_index++)
{
strcpy(l_ref_id, ps_errors[i_curr_index].s_ref_id);
strcpy(l_ref_seq_no, ps_errors[i_curr_index].s_ref_seq_no);
strcpy(l_err_msg, ps_errors[i_curr_index].s_err_msg);

EXEC SQL
UPDATE some_table
SET status = 'E',
error_message = :l_err_msg
WHERE ref_id = :l_ref_id
AND ref_seq_no = :l_ref_seq_no;

if (SQL_ERROR_FOUND)
{
sprintf(err_data, "Updation failed with sql errors ");
strcpy(table, "some_table");
WRITE_ERROR(SQLCODE,function,"",err_data);
return(FATAL);
}
}

瓶颈是上面的for循环(也是程序的最后一步),循环次数太多导致程序运行时间过长。我想知道是否有办法将主机结构数组 ps_errors CAST 转换为 Oracle 表类型,以便我可以轻松地进行批量 UPDATE 或甚至可以使用一些并行 DML 执行 MERGE,而不必遍历每条记录。

最佳答案

从我在工作中看到的一些其他类似的代码推断,你可以做这样的事情而不是 for 循环:

EXEC SQL for :pl_err_count
UPDATE some_table
SET status = 'E',
error_message = :ps_errors.s_err_msg
WHERE ref_id = :ps_errors.s_ref_id
AND ref_seq_no = :ps_errors.s_ref_seq_no;

这可能依赖于添加到 ps_errors 的内容被 null 终止。考虑到在现有代码中使用 strcpy() 而不是 strncpy()(或类似代码),我猜他们已经是了。

如果 s_err_msg 可以为 null,您还应该考虑使用 indicator variables .例如。

       error_message = :ps_errors.s_err_msg INDICATOR :indicator_variable

关于将主机结构数组转换为表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29839310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com