我从 Pro*C 开始,并且有一个程序可以读取记录并按识别值(客人)分组打印出来。为了打印所有信息,我使用了 for 循环中的一个 break 来控制去哪里。它可以编译,但没有遵循打印方案,实际上进入了无限循环。最后的最后一个中断是停止无限循环,并且由于某种原因它没有达到任何条件(即使是默认的 else)。它正在执行的远程数据库服务器上的调试有限(dbx 不可用)。
虽然不是光标结尾(即 sqlcode = 0) 如果 PrevSaleItem Not = Cursor.Item_ID 写入项目的小计 初始化 ItemQty 和 ItemTotal 为 0 将 PrevSaleItem 设置为 Cursor.Item_ID 如果打印输出详细信息行结束 添加 Cursor.Quantity 到 ItemQty 添加Cursor.calc_tax 到 ItemTotal 和 GuestTotal 获取光标中的下一条记录 End While 打印最后一项的小计 打印总计
exec sql open dbGuest;
exec sql fetch dbGuest into :sLastName, :sFirstName, :nItemID, :sItemName, :nQuantity, :nUnitPrice, :sTransDate, :sHotelName, :nHotelID, :sTaxable, :nCalcTax;
/* Lets check the status of the OPEN statement before proceeding , else exceptions would be suppressed */
if(sqlca.sqlcode !=0) // If anything went wrong or we read past eof, stop the loop
{
printf("Error while opening Cursor <%d><%s>\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
break;
}
int PrevSaleItem = 0;
int ItemQty = 0;
double ItemTotal = 0.0;
double GuestTotal = 0.0;
for(;;)
{
printf("%s %s %s %s %d\n","Charge Summary for:", sFirstName.arr, sLastName.arr, " Guest_ID:", nGuest_ID);
printf("%s %d %s %s \n", "Sales_Item: ", nItemID, " - ", sItemName.arr);
// Do the crazy stuff to end the C-Strings
sLastName.arr[sLastName.len] = 0;
sFirstName.arr[sFirstName.len] = 0;
sItemName.arr[sItemName.len] = 0;
sTransDate.arr[sTransDate.len] = 0;
sHotelName.arr[sHotelName.len] = 0;
sTaxable.arr[sTaxable.len] = 0;
// initialize
PrevSaleItem = nItemID;
ItemQty = 0;
ItemTotal = 0.0;
GuestTotal = 0.0;
//While not end of cursor (ie. sqlcode = 0)
/* Check for No DATA FOUND */
if (sqlca.sqlcode == 0)
{
if(PrevSaleItem != nItemID)
{
printf("ItemQty: %f \t ItemTotal: %f",ItemQty,ItemTotal);
ItemTotal = 0.0;
GuestTotal = 0.0;
PrevSaleItem = nItemID;
}
printf("GuestTotal \t\t %f",GuestTotal);
ItemQty += nQuantity;
ItemTotal += nCalcTax;
GuestTotal += nCalcTax;
}
else if(sqlca.sqlcode == 100 || sqlca.sqlcode == 1403) // If anything went wrong or we read past eof, stop the loop
{
printf("CURSOR is empty after all fetch");
PrevSaleItem = -1;
break;
}
/* Check for other errors */
else if(sqlca.sqlcode != 0)
{
printf("Error while fetching from Cursor <%d><%s>\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
break;
}
else {printf("HIT ELSE"); break;}
break;
}
// close the cursor and end the program
exec sql close dbGuest ;
The logic that should be happening is as follows
:
假设中断机制位于外部 for 循环(未显示)内。它应该打开光标,获取第一条记录,然后打印客人和销售项目的标题。然后它通过设置值来初始化总计和中断变量。虽然不是光标的结尾(sqlcode 为 0,而不是 while 仅用于带中断的循环)如果前一个项目!= 项目 id,则它打印小计,将项目数量和总计初始化为 0,并将前一个项目设置为项目id (然后打破 if 条件)。项目数量按表中的数量增加,并calc_tax
添加到项目和客人总数中。获取下一条记录,打印最后一项的总计,然后打印该客人的总计。
它没有打印应该在的位置并且处于无限循环中,并且在我尝试在所有条件中中断之后,我无法解释它是如何发生的。我确信这是一个初学者的错误,所以也许一个 jr Oracle 开发人员(但专业人士会很棒)有时间让我回到正轨。