gpt4 book ai didi

c - Oracle Pro*C : Handling end of fetch cursor

转载 作者:行者123 更新时间:2023-11-30 15:58:03 24 4
gpt4 key购买 nike

我无法找出代码中的问题:

/* Declare a cursor for the FETCH statement. */
EXEC SQL DECLARE customer_cursor CURSOR FOR
SELECT CUSTOMER_ID, CUSTOMER_NAME
FROM CUSTOMER_TABLE
WHERE CUSTOMER_CARD_NUM = :argv[1];

if ( sqlca.sqlcode != 0 )
{
printf("Declare cursor failed\n");
return( sqlca.sqlcode );
}
EXEC SQL OPEN customer_cursor;
if ( sqlca.sqlcode != 0 )
{
printf("Open cursor failed\n");
return( sqlca.sqlcode );
}
EXEC SQL WHENEVER NOT FOUND GOTO no_match;

for ( ;; )
{
/* Fetching data */
EXEC SQL FETCH customer_cursor
INTO :var_customer_id, :var_customer_name;
if ( sqlca.sqlcode != 0 )
{
EXEC SQL CLOSE cust_data_cursor;
return ( sqlca.sqlcode );
}

/* Doing some stuff here */
processing_customer();

}
EXEC SQL CLOSE customer_cursor;

/* Handling the no data found here */
no_match:

printf("NO CUSTOMER MATCHING THIS CARD_NUM\n");
/* Some stuff */
......
return 1;

我的查询应该只返回一行或者什么都不返回,当什么都不返回时一切正常,但是当有匹配时,函数processing_customer被执行,奇怪的是no_match也被执行.

感谢您帮我解决这个问题。

最佳答案

正如 @Roger Cornejo 所建议的,如果存在匹配,您需要一种执行“不匹配”部分的方法。 no_match: 只是一个标签,因此没有什么可以告诉您的代码不要执行该部分。您要么需要在该标签之前返回,要么goto 其后的某些内容。您还需要在不匹配的情况下关闭光标。

但这似乎不必要地困惑,正如 @Arion 暗示的那样,您不需要为此使用显式光标 - 只需执行 select into 并捕获异常即可。

EXEC SQL SELECT CUSTOMER_ID, CUSTOMER_NAME
INTO :var_customer_id, :var_customer_name
FROM CUSTOMER_TABLE
WHERE CUSTOMER_CARD_NUM = :argv[1];

if (sqlca.sqlcode == 1403)
{
printf("NO CUSTOMER MATCHING THIS CARD_NUM\n");
/* Some stuff */
......
return 1;
}
if (sqlca.sqlcode != 0)
{
return ( sqlca.sqlcode );
}

/* Doing some stuff here */
processing_customer();

您说过会有零行或一行;如果有多个,您将收到太多行错误 (ORA-02112)。

关于c - Oracle Pro*C : Handling end of fetch cursor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10067438/

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