SELECT * FROM (SELECT T_GDS.OWNER_NO, T_GDS.GOODS_NO, T_GDS.GOODS_NAME, T_GDS.GOODS_LENGTH, T_GDS.GOODS_WIDTH, T_GDS.GOODS_HEIGHT, T_GDS.MARKETINGAUTHORISATIONHOLDER, (SELECT MIN(T_STK.DISPLAY_LOCATION) FROM VIW_FD_STOCK T_STK WHERE T_STK.GOODS_ID = T_GDS.GOODS_ID) DISPLAY_LOCATION FROM FD_GOODS T_GDS LEFT JOIN REC_GOODS_RST T_RST ON T_GDS.GOODS_ID = T_RST.GOODS_ID WHERE T_GDS.IS_AVAILABLE = 'Y' AND T_RST.LWH_MOD_FLG IS NULL AND T_GDS.IS_GIFT = 'N' AND (T_GDS.GOODS_LENGTH < = 1 OR T_GDS.GOODS_WIDTH < = 1 OR T_GDS.GOODS_HEIGHT < = 1) AND EXISTS (SELECT 1 FROM FD_STOCK T WHERE T.GOODS_ID = T_GDS.GOODS_ID)) WHERE (:GOODS_NO IS NULL OR GOODS_NO LIKE '%' || :GOODS_NO || '%') AND (:GOODS_NAME IS NULL OR GOODS_NAME LIKE '%' || :GOODS_NAME || '%') AND (:DISPLAY_LOCATION IS NULL OR DISPLAY_LOCATION LIKE '%' || :DISPLAY_LOCATION || '%') ORDER BY DISPLAY_LOCATION,GOODS_NO
我是这样做的,选生成perpareCall对像 call = conn.prepareCall(SQL);
然后换名字绑定 call.setObject("GOODS_NO", obj.get("Value"), obj.getInteger("Type")) call.setObject("GOODS_NAME", obj.get("Value"), obj.getInteger("Type")) call.setObject("DISPLAY_LOCATION", obj.get("Value"), obj.getInteger("Type"))
但程序报错 java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 4
然后我有6个变量但是同名的。实际只有3个。我也绑定了三个。但还是报错。但在.NET里这个同名变量绑定是可以正常执行的
就算我把同名的变量绑定两次也不行。报同样的错误
原提问者GitHub用户ighack
在 Java 中执行 SQL 语句时,可以使用 PreparedStatement 对象来绑定 SQL 语句中的参数。如果 SQL 语句中存在同名参数,可以使用“:参数名”来指定参数,如下所示:
java
Copy
String sql = "SELECT * FROM mytable WHERE col1 = :param1 AND col2 = :param2";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt("param1", value1);
pstmt.setString("param2", value2);
ResultSet rs = pstmt.executeQuery();
在上面的示例中,使用“:param1”和“:param2”来指定 SQL 语句中的参数名,并使用 setInt() 和 setString() 方法来绑定参数的值。需要注意的是,参数名中的“:”符号是必需的,以便让 PreparedStatement 对象正确识别参数。
如果 SQL 语句中存在多个同名参数,可以在参数名后面添加数字来区分不同的参数,如“:param1”、“:param2”等。此外,还可以使用“?”来指定参数,如下所示:
java
Copy
String sql = "SELECT * FROM mytable WHERE col1 = ? AND col2 = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, value1);
pstmt.setString(2, value2);
ResultSet rs = pstmt.executeQuery();
在上面的示例中,使用“?”来指定 SQL 语句中的参数,然后使用 setInt() 和 setString() 方法来绑定参数的值。需要注意的是,参数的位置从 1 开始,而不是从 0 开始。
我这里发现一个问题。如果SQL中出现同名的变量名绑定的时候会出现这个问题,需要手动处理一下 先要包装一下连接 OracleConnection connection = conn.unwrap(OracleConnection.class); ocall = (OracleCallableStatement) connection.prepareCall(SQL);
然后在绑定变量的时候用 ocall.setObjectAtName(obj.getString("ParameterName"), obj.get("Value"),obj.getInteger("Type"));
原回答者GitHub用户ighack
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。