首页 文章

Pro * C Oracle - 通过sql fetch循环

提问于
浏览
0

我从Pro * C开始,有一个程序可以读取记录并按照识别值(客人)打印出来 . 为了获得所有打印的信息,我使用for循环中断来控制其中的内容 . 它编译但它不遵循打印方案,实际上进入无限循环 . 最后的最后一个突破是停止无限循环,并且由于某种原因它没有达到任何条件(即使使用默认的其他) . 它正在执行的远程数据库服务器上的调试有限(dbx不可用) .

虽然不是游标的结尾(即sqlcode = 0)如果PrevSaleItem Not = Cursor.Item_ID写项的小计初始化ItemQty和ItemTotal为0将PrevSaleItem设置为Cursor.Item_ID结束如果打印输出细节线将Cursor.Quantity添加到ItemQty添加Cursor.calc_tax到ItemTotal和GuestTotal获取光标中的下一条记录结束时打印最后一项的小计打印总计

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循环内(未示出) . 它应该打开光标,获取第一条记录,然后打印客户和销售项目的 Headers . 然后通过设置值初始化总计并中断变量 . 虽然不是光标的结尾(sqlcode为0,而不是仅用于带有中断的循环)如果前一项!=项目ID,则它打印小计,初始化项目数量和总计为0并将前一项目设置为项目id(然后打破if条件) . 物料数量按表中的数量增加, calc_tax 将添加到物料和客人总数中 . 获取下一条记录,打印最后一项的总计,然后打印该客户的总计 .

它不会打印它应该存在的数量并且处于无限循环中,并且在我尝试了所有条件中的中断之后,我无法解释它是如何发生的 . 我确定这是一个初学者的错误,所以也许一个小的Oracle开发人员(但专业人员会很棒)有一个时刻让我回到正轨 .

1 回答

  • 2

    你的 fetchfor 循环之外 . 你在第一个 fetch 之后进入循环 . 如果 sqlca.sqlcode 在第一次获取后为零,则由于嵌套的 ifelse ,它没有到达任何中断,因此它再次绕过循环 . 因为没有第二次获取,你仍然有一个很好的 sqlcode ,所以它继续前进 . 我想....无论如何,将你的_1678204移动到循环中看起来就像你想要发生的那样?

    看起来确实应该开始 break ,但是昨天你发布了代码'd modified so I'我不确定这里是否也是如此 .

    如果您重新格式化代码并为 else 条件引入大括号和嵌套,您可以看到它们没有对齐 . 你展示的最终 { 不适用于 for ,它是其中一个分支 .

    for(;;)
    {
        if (sqlca.sqlcode == 0)
        {
            if(PrevSaleItem != nItemID)
            {
                ...
            }
            ....
        }
        else
        {
            if(sqlca.sqlcode == 100 || sqlca.sqlcode == 1403)
            {
                break;
            }
            else
            {
                if(sqlca.sqlcode != 0)
                {
                    break;
                }
                else
                {
                    printf("HIT ELSE");
                    break;
                }
                break;
            }
           // close the cursor and end the program
           exec sql close dbGuest ;
    

    else if(sqlca.sqlcode != 0) 是多余的;此时 sqlca.sqlcode 必须是0,100或1403以外的其他东西 . 所以它也无法到达下一个 else .

相关问题