我拼接了一个sql,在数据库中sql语句可正确运行,但在java代码中报错,sql命令未正确结束。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我拼接了一个sql,在数据库中sql语句可正确运行,但在java代码中报错,sql命令未正确结束。相关的知识,希望对你有一定的参考价值。
StringBuilder strSql = new StringBuilder();
strSql.append("SELECT A.FILEOPSW4,A.FILEOPSW36,A.FILEOPSW1,to_char(A.FILEOPSW9,'yyyy-MM-dd') as FILEOPSW9,");
strSql.append("A.FILEOPSW5,A.FILEOPSW34,B.TAG20,A.FILEOPSW28,A.FILEOPSW6,FILEOPSW35,A.FILEOPSW13,");
strSql.append("(select PRODUCTNAME from FILEFUND where CUSTID=a.FILEOPSW42 and PRODUCTID=a.FILEOPSW43) ");
strSql.append("as PRODUCTNAME,A.FILEOPSW41,A.FILEOPSW42,A.FILEOPSW43,a.FILEOPSW37,a.CALCELFLAG ");
strSql.append("FROM FILEOPSW A,SWIFTDATA B WHERE A.FILEOPSW1=B.SWIFTSEQNO ");
strSql.append("order by a.FILEOPSW9 desc ");
strSql.append(" SELECT A.FILEOPSW4,A.FILEOPSW36,A.FILEOPSW1,to_char(A.FILEOPSW9,'yyyy-MM-dd') as FILEOPSW9,");
strSql.append(" A.FILEOPSW5,A.FILEOPSW34,B.TAG20,A.FILEOPSW28,A.FILEOPSW6,FILEOPSW35,A.FILEOPSW13,");
strSql.append("( select PRODUCTNAME from FILEFUND where CUSTID=a.FILEOPSW42 and PRODUCTID=a.FILEOPSW43) ");
strSql.append(" as PRODUCTNAME,A.FILEOPSW41,A.FILEOPSW42,A.FILEOPSW43,a.FILEOPSW37,a.CALCELFLAG ");
strSql.append(" FROM FILEOPSW A,SWIFTDATA B WHERE A.FILEOPSW1=B.SWIFTSEQNO ");
strSql.append("order by a.FILEOPSW9 desc ");
拼接的时候 注意在每一个字符开头空一个 空字符出来,不然sql脚本里面会出错的
我按照您说的方法加空格也不行
1至6条是之前拼接的,可以执行,第7条是我后加的排序,运行时就报
WARN - SQL Error: 933, SQLState: 42000
ERROR - ORA-00933: SQL 命令未正确结束
INFO - org.hibernate.exception.SQLGrammarException: could not extract ResultSet
strSql.append("order by a.FILEOPSW9 desc "); 改为 strSql.append("order by a.[FILEOPSW9] desc "); 呢?
追问ERROR - ORA-01747: user.table.column, table.column 或列说明无效
又报这个错了
strSql.append("order by a.FILEOPSW9 desc ");
改为
strSql.append("order by a.FILEOPSW9 desc; "); 后面加一个分号呢?
WARN - SQL Error: 911, SQLState: 22019
ERROR - ORA-00911: 无效字符
告诉我无效字符,我在数据库执行没错,但在java中运行就报错,而且是加上最后一条排序的
strSql.append(" SELECT A.FILEOPSW4,A.FILEOPSW36,A.FILEOPSW1,to_char(A.FILEOPSW9,'yyyy-MM-dd') as FILEOPSW9_,");
strSql.append(" A.FILEOPSW5,A.FILEOPSW34,B.TAG20,A.FILEOPSW28,A.FILEOPSW6,FILEOPSW35,A.FILEOPSW13,");
strSql.append("( select PRODUCTNAME from FILEFUND where CUSTID=a.FILEOPSW42 and PRODUCTID=a.FILEOPSW43) ");
strSql.append(" as PRODUCTNAME,A.FILEOPSW41,A.FILEOPSW42,A.FILEOPSW43,a.FILEOPSW37,a.CALCELFLAG ");
strSql.append(" FROM FILEOPSW A,SWIFTDATA B WHERE A.FILEOPSW1=B.SWIFTSEQNO ");
strSql.append("order by a.FILEOPSW9 desc ");
第一行 to_char(A.FILEOPSW9,'yyyy-MM-dd') as FILEOPSW9 修改为 to_char(A.FILEOPSW9,'yyyy-MM-dd') as FILEOPSW9Extend
C# 字符串拼接Sql语句复杂的取变量值问题....
我现在需求是这样子的 用户自定义一条复杂的Sql语句 在这条Sql语句里 用户给其赋变量 运行程序后 如果该变量值有值 则将该值赋值给变量 如果无值则去除掉该判断语句 当Sql 语句拼接好以后 将完整的Sql语句传给WbService 取值
这只是一条简单的Sql 语句 还有更复杂的情况:
select e.organ_name 机构,f.depot_name 仓库, a.product_id 商品编码,b.product_name 商品名称,c.model_name 商品型号, b.product_unit 商品单位, a.store_num 库存数量,d.Price * g.exchange_rate 进价,h.Price 供价,i.Price 零售价 from Depot_storage_total_TB a with(nolock)
left join sys_pub_product b with(nolock) on a.product_id = b.product_id
left join Sys_Pub_product_xh c with(nolock) on b.model_id = c.model_id
left join sys_pub_product_price d with(nolock) on a.product_id = d.product_id and d.price_id = 1
left join sys_pub_product_price h with(nolock) on a.product_id = h.product_id and h.price_id = 2
left join sys_pub_product_price i with(nolock) on a.product_id = i.product_id and i.price_id = 4 and b.organ_sys_id= i.organ_sys_id
left join sys_Pub_currency g with(nolock) on d.cy_id = g.cy_id
left join sys_organ e with(nolock) on a.organ_sys_id = e.organ_sys_id
left join Sys_Pub_Depot_Info_TB f with(nolock) on a.depot_id = f.depot_id
where a.depot_id in
(
select depot_id from Sys_Pub_Depot_Info_TB with(nolock) where organ_sys_id in
(
select organ_sys_id from TBas_organ_relation with(nolock) where tax_organ_id = @taxorgan
)
and FSysID = 1 --drp,不是配件库
and FDepotStateID =1 --在用
)
and a.store_num <> 0
string a1=null; //变量1
string a2=null; //变量2
string strSql=null; //SQL查询语句
string strSql_add=null; //SQL查询语句的条件部分
strSql="select * from Tb_Nm ";
if(a1!=null && a1!="")
//表示该变量1不为空
if(strSql_add!="" && strSql_add!=null)
//表示条件部分有字符,此时查询条件为
strSql_add+=" and a1='"+a1+"' ";
else
//表示条件部分没有字符,此时查询条件为
strSql_add+=" where a1='"+a1+"' ";
if(a2!=null && a2!="")
//表示该变量2不为空
if(strSql_add!="" && strSql_add!=null)
//表示条件部分有字符,此时查询条件为
strSql_add+=" and a2='"+a2+"' ";
else
//表示条件部分没有字符,此时查询条件为
strSql_add+=" where a2='"+a2+"' ";
//最后把条件语句和SQL查询拼接一起
strSql=strSql+strSql_add;
//试一下吧!!有问题再追问我吧追问
感谢你最快的回答所以把分给你 但是貌似你这回答并不能解决什么问题
按照你的这种解法即使可行也将会造成大量冗余
我不知道你有没有看到我发的那条Sql 语句 那还是最简单的一种情况 但你这解法完全不知道在干嘛 如果有兴趣你可以试下用你的这个方法要怎样去拼接
我现在打算换另外一种简单的方式去解决这个问题 就是如果这个变量有值 就将该值替换变量 如果没值 就用1=1去替换这个条件
(
select organ_sys_id from TBas_organ_relation with(nolock) where tax_organ_id = @taxorgan
)
and"作为判断成功后需要拼接的语句,就可以了,这个语句不接上 ,整个sql照样执行,可以用string拼接,也可以用StringBuilder拼接。追问
哈哈 刚采纳楼上的答案就看到你的回答了 哎 你们都没有去试着去用我发的这条Sql语句拼接一下 如果你们亲自试了就发现 真没你们说的这么简单啊 复杂的情况很多 你仅仅只是这样拼接根本就不会成功! 我现在采取简单的方式去解决这个问题了 虽然没能采纳你的回答 不过对你真诚的回答表示感谢!
以上是关于我拼接了一个sql,在数据库中sql语句可正确运行,但在java代码中报错,sql命令未正确结束。的主要内容,如果未能解决你的问题,请参考以下文章