我正在从Microsoft SQL Server Studio执行以下查询,该查询工作正常并显示结果:
SELECT *
INTO #temp_table
FROM md_criteria_join
WHERE user_name = 'tecgaw'
UPDATE #temp_table
SET user_name = 'tec'
WHERE user_name != 'tec'
SELECT *
FROM md_criteria_join
WHERE user_name = 'tec'
AND view_name NOT IN (SELECT view_name
FROM md_criteria_join
WHERE user_name = 'tecgaw')
UNION
SELECT *
FROM #temp_table
ORDER BY view_name,
user_name,
crit_usage_seq,
crit_join_seq
但是,如果我在Java中执行相同的查询,则会抛出异常,声明"该语句未返回结果集。" 这里是Java代码:
statement = conn.getConnection().createStatement();
resultSet = stmt.executeQuery(sql.toString());
这是因为我不能在一个语句中执行多个SQL查询(即,创建#temp_table
,更新它,然后使用它,我的select语句)?
答案 0 :(得分:28)
JDBC因行数而感到困惑。
您需要使用SET NOCOUNT ON
。
答案 1 :(得分:17)
对数据操作使用execute
声明,例如插入,更新和删除,
{strong>数据检索 executeQuery
,例如选择
我建议您将程序分为两个语句execute
和一个executeQuery
。
如果您不希望这样做,请尝试用分号分隔语句。但是如果这给你一个结果集,我不确定这个动作。
答案 2 :(得分:2)
我在StackOverflow here中找到了类似的问题。您应该启用连接以支持多个语句,并使用;
将它们分开。具体例子见答案。但它只适用于MySql。
此外,我认为您可以将SQL重写为单个查询
SELECT columnA, columnB, 'tec' as user_name from md_criteria_join
WHERE (
user_name = 'tec'
AND view_name NOT IN (
SELECT view_name
FROM md_criteria_join
WHERE user_name = 'tecgaw')
)
OR user_name = 'tecgaw'
ORDER BY view_name, user_name, crit_usage_seq, crit_join_seq
另一种选择是将语句移动到存储过程并使用CallableStatement
从JDBC中调用它或许您应该尝试使用多个jdbc语句执行它,例如
Connection conn = conn.getConnection(); //just to make sure its on single connection
conn.createStatement("SELECT INTO #temp_table").executeUpdate();
conn.createStatement("UPDATE #temp_table").executeUpdate();
conn.createStatement("SELECT ...").executeQuery();
请注意,您必须关闭资源,为了获得更好的性能,您可以使用addBatch和executeBatch方法
答案 3 :(得分:1)
在ms sql中你还必须在存储过程开头的右边设置nocount以及用“;”终止select / update / insert块语句