[英]Java JDBC - invalid character, put printing query and using it in SQLDeveloper works
rootID,FSA和其他都在代码的前面生成。
PreparedStatement getPotentialParents;
sql = "SELECT UNIQUE_ID, NAME, ADDRESS_1, ADDRESS_2, POSTAL_CODE FROM "
+ "(SELECT * FROM("
+ "SELECT p.*, CONNECT_BY_ROOT UNIQUE_ID AS ROOT_ID "
+ "FROM UNIQUE_CLINIC p "
+ "START WITH PARENT_ID IS NULL "
+ "CONNECT BY PRIOR UNIQUE_ID = PARENT_ID "
+ "ORDER BY ROOT_ID))" + "WHERE ROOT_ID <> " + rootID + " "
+ "AND (FSA = '" + FSA + "' "
+ "OR NAME IN (" + others + ") "
+ "OR ADDRESS_1 IN (" + others + ") "
+ "OR ADDRESS_2 IN (" + others + "));";
System.out.println(sql);
getPotentialParents = connection.prepareStatement(sql);
rs = getPotentialParents.executeQuery();
运行此查询时,在执行期间出现此错误:ORA-00911:无效字符
但是,打印的SQL可以在SQLDeveloper上运行而不会出现错误:
SELECT UNIQUE_ID, NAME, ADDRESS_1, ADDRESS_2, POSTAL_CODE FROM (SELECT * FROM(SELECT p.*, CONNECT_BY_ROOT UNIQUE_ID AS ROOT_ID FROM UNIQUE_CLINIC p START WITH PARENT_ID IS NULL CONNECT BY PRIOR UNIQUE_ID = PARENT_ID ORDER BY ROOT_ID))
WHERE ROOT_ID <> 10548 AND (FSA = 'null' OR NAME IN ('BRENNAN''S AWESOME PHARMACY #1', '38 SOLUTIONS DR', 'NULLNULLNULL') OR ADDRESS_1 IN ('BRENNAN''S AWESOME PHARMACY #1', '38 SOLUTIONS DR', 'NULLNULLNULL') OR ADDRESS_2 IN ('BRENNAN''S AWESOME PHARMACY #1', '38 SOLUTIONS DR', 'NULLNULLNULL'));
我猜JDBC在查询之前会对SQL字符串做一些事情。 知道是什么原因造成的吗? 如何获得实际查询?
我进行了一些更新,但仍然无法正常工作,给我一个无效字符。 再次,打印的sql可以在sqldev中运行,没有问题。
String FSA = rs.getString("FSA");
String rootID = String.valueOf((rs.getInt("ROOT_ID")));
String others = "'" + rs.getString("NAME").replace("'", "''") + "', '" + rs.getString("ADDRESS_1").replace("'", "''") + "', '" + rs.getString("ADDRESS_2").replace("'", "''") + "'";
Statement getPotentialParents = connection.createStatement();
sql = "SELECT UNIQUE_ID, NAME, ADDRESS_1, ADDRESS_2, POSTAL_CODE FROM "
+ "(SELECT * FROM("
+ "SELECT p.*, CONNECT_BY_ROOT UNIQUE_ID AS ROOT_ID "
+ "FROM UNIQUE_CLINIC p "
+ "START WITH PARENT_ID IS NULL "
+ "CONNECT BY PRIOR UNIQUE_ID = PARENT_ID "
+ "ORDER BY ROOT_ID)) " + "WHERE ROOT_ID <> " + rootID + " "
+ "AND (FSA = '" + FSA + "' "
+ "OR NAME IN (" + others + ") "
+ "OR ADDRESS_1 IN (" + others + ") "
+ "OR ADDRESS_2 IN (" + others + "));";
System.out.println(sql);
rs = getPotentialParents.executeQuery(sql);
您不能像这样使用PreparedStatement。 您必须使用setString()方法在qyery中设置值。 否则,用户使用CreateStatement而不是PreparedStatement
语句getPotentialParents;
sql = "SELECT UNIQUE_ID, NAME, ADDRESS_1, ADDRESS_2, POSTAL_CODE FROM "
+ "(SELECT * FROM("
+ "SELECT p.*, CONNECT_BY_ROOT UNIQUE_ID AS ROOT_ID "
+ "FROM UNIQUE_CLINIC p "
+ "START WITH PARENT_ID IS NULL "
+ "CONNECT BY PRIOR UNIQUE_ID = PARENT_ID "
+ "ORDER BY ROOT_ID))" + "WHERE ROOT_ID <> " + rootID + " "
+ "AND (FSA = '" + FSA + "' "
+ "OR NAME IN (" + others + ") "
+ "OR ADDRESS_1 IN (" + others + ") "
+ "OR ADDRESS_2 IN (" + others + "));";
System.out.println(sql);
getPotentialParents = connection.createStatement(sql);
rs = getPotentialParents.executeQuery();
首先,检查是否在Oracle中达到了预期的结果:
VARIABLE rootid NUMBER;
VARIABLE fsa VARCHAR2(20);
VARIABLE name VARCHAR2(20);
VARIABLE address1 VARCHAR2(200);
VARIABLE address2 VARCHAR2(200);
BEGIN
:rootid := 10548;
:fsa := 'null';
:name := 'BRENNAN''S AWESOME PHARMACY #1';
:address1 := '38 SOLUTIONS DR';
:address2 := 'NULLNULLNULL';
END;
/
SELECT UNIQUE_ID,
NAME,
ADDRESS_1,
ADDRESS_2,
POSTAL_CODE
FROM (
SELECT *
FROM (
SELECT p.*,
CONNECT_BY_ROOT UNIQUE_ID AS ROOT_ID
FROM UNIQUE_CLINIC p
START WITH PARENT_ID IS NULL
CONNECT BY PRIOR UNIQUE_ID = PARENT_ID
ORDER BY ROOT_ID
)
)
WHERE ROOT_ID <> :rootid
AND ( FSA = :fsa
OR NAME IN ( :name, :address1, :address2 )
OR ADDRESS_1 IN ( :name, :address1, :address2 )
OR ADDRESS_2 IN ( :name, :address1, :address2 )
);
如果是这样,则可以只使用Java中的绑定变量:
(请注意,查询不需要尾随;
。)
String sql = "SELECT UNIQUE_ID, NAME, ADDRESS_1, ADDRESS_2, POSTAL_CODE FROM ( SELECT * FROM ( SELECT p.*, CONNECT_BY_ROOT UNIQUE_ID AS ROOT_ID FROM UNIQUE_CLINIC p START WITH PARENT_ID IS NULL CONNECT BY PRIOR UNIQUE_ID = PARENT_ID ORDER BY ROOT_ID ) ) WHERE ROOT_ID <> :rootid AND ( FSA = :fsa OR NAME IN ( :name, :address1, :address2 ) OR ADDRESS_1 IN ( :name, :address1, :address2 ) OR ADDRESS_2 IN ( :name, :address1, :address2 ) )";
PreparedStatement ps=connection.prepareStatement( sql );
OraclePreparedStatement ops = (OraclePreparedStatement) ps;
ops.setStringAtName( "fsa", rs.getString("FSA") );
ops.setIntAtName( "rootid", rs.getInt("ROOT_ID") );
ops.setStringAtName( "name", rs.getString("NAME") );
ops.setStringAtName( "address1", rs.getString("ADDRESS_1") );
ops.setStringAtName( "address2", rs.getString("ADDRESS_2") );
ps.execute();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.