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