2011-04-03 34 views
1

我正在做一個學習C語言嵌入式SQL的任務。前五個查詢工作得很好,但現在我似乎被卡住了。即使它的結構與之前的查詢完全一樣,我也沒有得到任何輸出。我可能只是想念一些愚蠢的東西。思考?嵌入式SQL - 無輸出?

[ed]以下是應該從查詢得到的表格。它裏面有空值,我得到一個SQL錯誤-305需要空指示符。

FIRST_NAME MIDDLE_NAME LAST_NAME   BRANCH_NO 
---------- ----------- -------------------- --------- 
III  -   AAAAA    1000  
KKK  -   BBB     1000  
MMM  -   CC     3000  
K   PP   DDD     3000  
IIIII  SSS   DDDDD    3000  
JJJ  QQ   EEE     3000  
JJJ  PP   GGG     1000  
K   -   GGG     1000  
MEI  -   JIANG    3000  
JASPER  CHIACHUN WENG     1000  

    10 record(s) selected. 

[/ ED]

void query6() 
{ 
    // SQL Query Definition 
    EXEC SQL 
    DECLARE c6 CURSOR FOR 
     SELECT s.first_name, s.middle_name, s.last_name, b.branch_no 
     FROM staff AS s, branch AS b 
     WHERE s.allocated_to = b.branch_no AND 
      s.allocated_to IN (SELECT branch_no 
           FROM branch 
           WHERE city = 'HAMILTON') 
     ORDER BY s.last_name, s.first_name, s.middle_name; 

    // Pretty Output 
    printf("\n%-15s %-15s %-15s %-15s\n", 
     "FIRST_NAME","MIDDLE_NAME","LAST_NAME","BRANCH_NO"); 
    printf("%-15s %-15s %-15s %-15s\n", 
     "----------","-----------","---------","---------"); 

    // Fetch SQL Result and Print 
    EXEC SQL OPEN c6; 
    while(1) 
    { 
    printf("fetch\n"); 
    EXEC SQL FETCH c6 INTO :sqlBuffer1, 
          :sqlBuffer2, 
          :sqlBuffer3, 
          :sqlBuffer4; 
    depad(sqlBuffer1); 
    depad(sqlBuffer2); 
    depad(sqlBuffer3); 
    depad(sqlBuffer4); 
    if (SQLCODE!=0) break; 
    printf("%-15s %-15s %-15s %-15s\n", 
      sqlBuffer1,sqlBuffer2,sqlBuffer3,sqlBuffer4); 
    } 
    EXEC SQL CLOSE c6; 
    printf("\n"); 

    return;   
} 
+0

謝謝@thkala,我會學習最終格式化我的代碼塊! – Eric 2011-04-03 19:51:03

+0

將它粘貼到編輯文本框中並單擊該框上方的「{}」按鈕後,只需標記您的代碼即可。 – thkala 2011-04-03 19:52:02

+0

那簡單的呃?那我下次再拿! LOL – Eric 2011-04-03 19:53:57

回答

0

明白了!空值需要明確解決。

void query6() 
{ 
    // SQL Query Definition 
    EXEC SQL 
    DECLARE c6 CURSOR FOR 
     SELECT FIRST_NAME,MIDDLE_NAME,LAST_NAME,BRANCH_NO 
     FROM STAFF,BRANCH 
     WHERE STAFF.ALLOCATED_TO=BRANCH.BRANCH_NO AND 
      BRANCH.CITY='HAMILTON' 
     ORDER BY LAST_NAME,FIRST_NAME,MIDDLE_NAME; 

    // Pretty Output 
    printf("\n%-15s %-15s %-15s %-15s\n", 
     "FIRST_NAME","MIDDLE_NAME","LAST_NAME","BRANCH_NO"); 
    printf("%-15s %-15s %-15s %-15s\n", 
     "----------","-----------","---------","---------"); 

    // Fetch SQL Result and Print 
    EXEC SQL OPEN c6; 
    while(1) 
    { 
    EXEC SQL FETCH c6 INTO :sqlBuffer1:b1Null, 
          :sqlBuffer2:b2Null, 
          :sqlBuffer3:b3Null, 
          :sqlBuffer4:b4Null; 

    //sqlerr("fetch"); 
    if (SQLCODE!=0) break; 

    if (b1Null == 0) 
     depad(sqlBuffer1); 
    else strcpy(sqlBuffer1,"--"); 
    if (b2Null == 0) 
     depad(sqlBuffer2); 
    else strcpy(sqlBuffer2,"--"); 
    if (b3Null == 0) 
     depad(sqlBuffer3); 
    else strcpy(sqlBuffer3,"--"); 
    if (b4Null == 0) 
     depad(sqlBuffer4); 
    else strcpy(sqlBuffer4,"--"); 

    printf("%-15s %-15s %-15s %-15s\n", 
      sqlBuffer1,sqlBuffer2,sqlBuffer3,sqlBuffer4); 
    } 
    EXEC SQL CLOSE c6; 
    printf("\n"); 

    return;   
} 
0

這似乎有效,但我爾德可能會寫它像這樣:

SELECT s.first_name, s.middle_name, s.last_name, b.branch_no 
    FROM staff AS s, (SELECT branch.branch_no FROM branch WHERE branch.city = 'HAMILTON') AS b 
    WHERE s.allocated_to = b.branch_no 
    ORDER BY s.last_name, s.first_name, s.middle_name; 
+0

仍然沒有輸出。 while循環中的'fetch'調試語句只觸發一次,但它應該有10個記錄來查找。查詢工作正常,當它沒有嵌入... – Eric 2011-04-03 19:57:47

+0

hav你試圖明確的在子查詢中列名稱(tablename.columnname)..我只是在Mysql中給它一個鏡頭,我不得不這樣做...更新我的代碼來反映這一點。我應該注意到,我不知道甚至涉足C,所以如果它的C代碼存在問題,那麼其他人將不得不響應,但是我給你的SQL應該沒問題。 – prodigitalson 2011-04-03 20:02:14

+0

你確定你有's.allocated_to = b.branch_no'對所有10條記錄都是正確的?當使用這種語法時,只會返回匹配AS的結果,而不是使用'LEFT JOIN',它將返回父表中的所有結果,而不管它們是否具有與您的'branch_no'之一匹配的'allocated_to'值 – prodigitalson 2011-04-03 20:14:55