sql查询语句中所带参数,在windows环境和linux环境java工程中为啥表现不同?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql查询语句中所带参数,在windows环境和linux环境java工程中为啥表现不同?相关的知识,希望对你有一定的参考价值。

public static void main(String[] args)
List<String> list = new ArrayList<String>();
list.add("978-7-117-12632-8");
list.add("978-7-117-16417-7");
list.add("978-7-117-16418-4");
String ibsns = "";
for(String ibsn:list)
ibsns += "'" + ibsn + "',";

ibsns = ibsns.substring(0, ibsns.lastIndexOf(","));
int count = new Q("select count(*) from ZMAllResource where resourceType=? and resourceNo in (" + ibsns + ")","CaseBook").executeInt();
System.out.print(count);

windows环境SQL语句正常:select count(*) from ZMAllResource where resourceType='CaseBook' and resourceNo in ('978-7-117-12632-8','978-7-117-16417-7','978-7-117-16418-4');
linux环境SQL语句异常:select count(*) from ZMAllResource where resourceType='CaseBook' and
resourceNo in
(''978-7-117-12632-8','978-7-117-16417-7','978-7-117-16418-4'');
缺失右括号

windows环境SQL语句

select count(*) from ZMAllResource where resourceType=\'CaseBook\' and resourceNo in (\'978-7-117-12632-8\',\'978-7-117-16417-7\',\'978-7-117-16418-4\');

linux环境SQL语句

select count(*) from ZMAllResource where resourceType=\'CaseBook\' and 
resourceNo in (\'\'978-7-117-12632-8\',\'978-7-117-16417-7\',\'978-7-117-16418-4\'\');


很明显Linux环境下的SQL语句在In里的两侧都多了一个【\'】,你看看程序里写的是否有错误吧,

这个应该和数据库没有关系的,是你程序在组织SQL语句时发生的错误

参考技术A

试试用改造一下:

StringBuilder builder = new StringBuilder();
builder.append("");

参考技术B 你说的不同是不是linux里括号里面两边多了两个'追问

是的,在本地windows环境没问题,放到服务器linux环境下面括号里面两边多了两个'

oracle PL/SQL编程语言之游标的使用

(本文章内容仅在windows10下经测试能够运行,不能保证其他环境下的可靠性)

PL/SQL游标
概念:类似于集合

 

 

定义游标
关键字:cursor;
1、不带参数游标
语法:cursor 游标变量名 is 查询语句;

示例代码如下:

cursor c1 is select * from emp;

 


2、带参数游标
语法:cursor 游标变量名(参数名 数据类型...) is 查询语句(查询语句语句的右值可以使用游标参数);

示例代码如下:

cursor c2(dno emp.deptno%type) is select empno from emp where deptno = dno;

 

遍历游标

关键字:open;fetch;close; 

1、不带参数的游标

语法:

open 游标变量名;

  loop

    fetch 游标变量名 into 变量名;

    exit when 条件(常使用:游标变量名%notfound;)

    循环体(使用变量执行其他语句)

  end loop;

close 游标变量名;

示例代码如下:

open c1;
  loop
    fetch c1 into e;
    exit when c1%notfound;
    dbms_output.put_line(e.ename);
  end loop;
  close c1;

 

2、带参数的游标

语法:

open 游标变量名(实参列表);

 

  loop

    fetch 游标变量名 into 变量;

    exit loop 条件(常使用:游标变量名%notfound;)

    循环体(使用变量执行其他语句)

  end loop;

close 游标变量名;

示例代码如下:

open c2(10);
  loop
    fetch c2 into eno;
    exit when c2%notfound;
    update emp set sal = sal + 10 where empno = eno;
    commit;  
  end loop;
  close c2;

 

使用游标的两个简单案例

1、使用游标输出emp表所有员工姓名

示例代码如下:

--使用游标遍历输出emp表员工姓名
declare
  cursor c1 is select * from emp;
  e emp%rowtype;
begin
  open c1;
  loop
    fetch c1 into e;
    exit when c1%notfound;
    dbms_output.put_line(e.ename);
  end loop;
  close c1;
end;

 

2、使用游标给emp表部门编号为10的所有员工增加工资10

示例代码如下:

--使用游标给emp部门编号为10的员工涨10元工资
declare
  cursor c2(dno emp.deptno%type) is select empno from emp where deptno = dno;
  eno emp.empno%type;
begin
  open c2(10);
  loop
    fetch c2 into eno;
    exit when c2%notfound;
    update emp set sal = sal + 10 where empno = eno;
    commit;  
  end loop;
  close c2;
end;

 

以上是关于sql查询语句中所带参数,在windows环境和linux环境java工程中为啥表现不同?的主要内容,如果未能解决你的问题,请参考以下文章

PHP-CGI远程代码执行漏洞(CVE-2012-1823)

sql查询语句 查询text字段类型中所含某个字符的所有 列

oracle PL/SQL编程语言之游标的使用

oracle PL/SQL编程语言之游标的使用

如何提高 SQL Azure 查询性能

如何在 node.js 环境中将查询语句传递给 bigquery