当前,在使用RWDBOSql的fetch()函数时,我们遇到了一个奇怪的问题。 当我们从C ++代码构建查询并从代码运行查询时,它将无法正常工作。
但是,当我们从代码构建并从日志复制并在Toad / sql开发人员中运行的查询相同时 工作正常。因此,我们不确定为什么在代码中运行同一查询时会有不同的表现 然后将其粘贴到蟾蜍上。
请检查我们使用以下代码构建的belwo查询-
案例1-
RWCString sql_string ("SELECT * FROM ( SELECT ID "
"FROM VIEW1 V1, VIEW2 V2 "
"WHERE V1.CLIENT_ID='");
sql_string.append(string1);
sql_string.append("' AND V1.UNIT_ID = V2.ACTION_ID AND "
"(V2.S_TYPE='S1' OR V2.S_TYPE='S2') "
"ORDER BY V1.CTDB_CRE_DATETIME DESC) WHERE ROWNUM = 1;");
生成了以下查询-
SELECT * FROM(在VIEW1 V1和VIEW2 V2中选择ID V1.CLIENT_ID ='123456'AND V1.UNIT_ID = V2.ACTION_ID AND (V2.S_TYPE ='S1'或V2.S_TYPE ='S2')按V1.CRE_DATETIME DESC排序) WROWE ROWNUM = 1;
然后我们将提取函数称为-
RWDBOSql get_order_query(sql_string);
RWDBTBuffer<RWCString> order(100);
get_order_query[0] >> order;
while (get_order_query.fetch(),get_order_query.rowsFetched() > 0)
{
value = order[0];
value = value.strip(RWCString::both);
}
现在,在这种情况下,它不会进入while循环,并且实际上会获取返回-1。
但是从toad / sql developer中运行该查询时,它会运行并给出结果集。
我们通过用以下几行替换上面的代码来解决此问题-
案例2-
std::ostrstream sql_statement;
sql_statement << "SELECT ID ";
sql_statement << "FROM VIEW1 V1, VIEW2 V2 ";
sql_statement << "WHERE V1.CLIENT_ID='" << string1 << "' AND V1.UNIT_ID = V2.ACTION_ID AND ";
sql_statement << "(V2.S_TYPE='S1' OR V2.S_TYPE='S2') ";
sql_statement << "ORDER BY V1.CTDB_CRE_DATETIME DESC" << std::ends;
生成了以下查询-
在VIEW1 V1,VIEW2 V2 V1.CLIENT_ID ='123456'和中选择ID V1.UNIT_ID = V2.ACTION_ID AND(V2.S_TYPE ='S1'或V2.S_TYPE ='S2')ORDER 到V1.CTDB_CRE_DATETIME DESC
然后我们将提取函数称为-
RWDBOSql get_order_query(sql_statement.str());
RWDBTBuffer<RWCString> order(500);
get_oms_order_query[0] >> order;
while (get_order_query.fetch(),get_order_query.rowsFetched() > 0)
{
for (int i = 0; i < get_order_query.rowsFetched(); i++)
{
value = order[0];
value = value.strip(RWCString::both);
break;
}
}
在这种情况下,当我们从日志中复制查询时,如果在蟾蜍中运行查询,代码也可以正常运行。
请让我们知道为什么案例1中的代码无法正常工作。我们做错了什么吗?