2011-04-03 7 views
1

私はCで埋め込みSQLを学習する課題を行っています。最初の5つのクエリは正常に動作しますが、今は固執しているようです。以前のクエリとまったく同じ構造になっていても、私はこの出力を得られません。私はたぶん愚かなものを逃しているだけだろう。思考?Embedded SQL - 出力はありませんか?

[編集]以下は、クエリの結果であるべき表です。それにはnull値があり、SQLエラー-305 Nullインジケータが必要です。

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

+0

あなたのコードを編集テキストボックスに貼り付けて、その上にある '{}'ボタンをクリックするだけで、あなたのコードに印を付けるだけです。 – thkala

+0

それは簡単ですか?私は次回はそれを手に入れよう! LOL – Eric

答えて

0

がそれを手に入れました! NULL値は明示的に扱われる必要があります。

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

+0

havサブクエリー内の列名(tablename.columnname)について明示的に表示しようとしています...私はちょうどそれをMysqlで撮影しました。これを反映するコード。 ITは私が知っているか、Cでも言いたいことがありますので、Cコードの問題が誰かにチャイムする必要がありますが、私が与えたSQLはうまくいくはずです – prodigitalson

+0

あなたは 's.allocated_to = b.branch_no'はこれらのレコードの10個すべてに当てはまりますか?この構文を使用すると、 'LEFT JOIN'を使用するのとは対照的に結果が返されます。これは、' branches_no'のいずれかと一致する 'allocated_to'値を持っているかどうかにかかわらず、親テーブルのすべての結果を返します – prodigitalson

関連する問題