我拼接了一个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 ");

executeQuery是专门用于执行sql查询的方法,从你的sql来开不是查询,而是执行的见表和插入语句,这种操作应该使用executeUpdate方法,同时不要把见表语句和insert语句拼成一个整个的语句去执行,这种方式在数据库直接执行ok没问题,但通过代码走 参考技术A 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 ");

拼接的时候  注意在每一个字符开头空一个 空字符出来,不然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中运行就报错,而且是加上最后一条排序的

追答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 ");

第一行 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去替换这个条件

参考技术A 变量有没有,在程序中判断,然后 "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"作为判断成功后需要拼接的语句,就可以了,这个语句不接上 ,整个sql照样执行,可以用string拼接,也可以用StringBuilder拼接。追问

哈哈 刚采纳楼上的答案就看到你的回答了 哎 你们都没有去试着去用我发的这条Sql语句拼接一下 如果你们亲自试了就发现 真没你们说的这么简单啊 复杂的情况很多 你仅仅只是这样拼接根本就不会成功! 我现在采取简单的方式去解决这个问题了 虽然没能采纳你的回答 不过对你真诚的回答表示感谢!

以上是关于我拼接了一个sql,在数据库中sql语句可正确运行,但在java代码中报错,sql命令未正确结束。的主要内容,如果未能解决你的问题,请参考以下文章

sql查询字符串拼接

6.计算字段 ---SQL

sql语句加参数

1、sql查询语句时怎么把几个字段拼接成一个字段?这几个字段是整型的。

MySQL的sql语句如何将一列数据拼接成一个字符串?

Java中如何拼接sql或者其他含有变量语句