嵌入式SQL-没有输出?

嵌入式SQL-没有输出?,sql,c,Sql,C,我正在做一项作业,学习C语言中的嵌入式SQL。前五个查询工作得很好,但现在我似乎被卡住了。我没有得到任何关于这个的输出,即使它的结构与前面的查询完全相同。我可能只是错过了一些愚蠢的事情。想法 [ed]以下是查询结果的表。其中有空值,我得到一个SQL错误-需要305个空指示符 FIRST_NAME MIDDLE_NAME LAST_NAME BRANCH_NO ---------- ----------- -------------------- --------- III

我正在做一项作业,学习C语言中的嵌入式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]


它似乎有效,但我可能会这样写:

  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;

明白了!空值需要显式寻址

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;         
}

谢谢@thkala,我最终会学会格式化我的代码块!将代码粘贴到编辑文本框中后,只需标记代码,然后单击框上方的
{}
按钮即可。这很简单吧?那我下次就去拿!LOLIt在我看来,你可以用
b.city='HAMILTON'
代替WHERE子句中的
s.allocated\u部分。它不会(不应该)改变结果,它只是相同条件的简化版本。仍然没有输出。while循环中的“fetch”调试语句只命中一次,但它应该有10条记录要查找。当查询未嵌入时,它可以正常工作…如果您尝试明确子查询中的列名(tablename.columnname)。。我只是在Mysql中试一试,我必须这样做。。。更新了我的代码以反映这一点。需要注意的是,我不知道或甚至不懂C,因此如果您的C代码有问题,那么其他人将不得不插话,但我给您的SQL应该很好。您确定
s.allocated_to=b.branch_no
对所有10条记录都是正确的吗?当使用此语法时,它将只返回匹配的结果,而不是使用
左联接
,该联接将返回父表中的所有结果,而不管它们是否有一个
分配给
的值与您的
分支编号
的其中一个sYeah匹配,前面的任务是直接在DB2中执行SQL查询。我现在所做的就是将查询复制/粘贴到C中,并尝试让它们工作。直到这一次才有问题。而且,我对所有列名都进行了显式处理,但没有任何效果。
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;         
}