Встроенный SQL - Нет вывода? - PullRequest
1 голос
/ 03 апреля 2011

Я занимаюсь изучением встроенного SQL на C. Первые пять запросов работают нормально, но теперь я застрял. Я не получаю никакого вывода об этом, хотя он структурирован точно так же, как и предыдущие запросы. Я, наверное, просто скучаю по чему-то глупому. Мысли

[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.

[/ Под ред]

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

Ответы [ 2 ]

0 голосов
/ 04 апреля 2011

Понял! Нулевые значения должны быть адресованы явно.

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 голосов
/ 03 апреля 2011

Кажется действительным, но я, вероятно, напишу это так:

  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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...