2012-04-08 92 views
0

的結束,我不能在我的代碼找出問題:甲骨文PRO * C:取處理光標

/* 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也被執行

感謝您幫助我解決這個問題。

+0

爲什麼使用光標? – Arion 2012-04-09 00:05:38

+0

爲什麼不呢?這是做這件事的傳統方式。你有更好的主意嗎? – iPadDevloperJr 2012-04-09 00:07:41

+0

讓我以另一種方式詢問..做光標的目的是什麼? – Arion 2012-04-09 00:13:22

回答

1

正如@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)。

+0

池:偉大的答案謝謝男人:),這解決了我的問題。 – iPadDevloperJr 2012-04-10 20:42:22

0

在「EXEC SQL CLOSE customer_cursor;」之後添加GOTO

+0

謝謝,但GOTO是什麼? – iPadDevloperJr 2012-04-09 14:21:57

+0

我按照你的建議添加了一個新的GOTO,但在光標的末尾仍然會出現一個奇怪的行爲! – iPadDevloperJr 2012-04-09 15:28:47

0

更改標籤「NO_MATCH」到「no_more_records」,你就會明白爲什麼它運行2次:

一)時,有沒有記錄,取數據引發了NOT FOUND條件inmediatly,因此會去標籤「no_more_records」

b)當有一個(或多個)記錄時,執行FETCH返回第一條記錄。

然後

如果(的sqlca.sqlcode!= 0)

評估爲假(事實上,只有有用的陷阱其它問題),然後

processing_customer ();

之後,FETCH再次運行(按無窮大),並像(a)中那樣運行:no_more_records條件到達。