开发者社区> 问答> 正文

java oracle 执行SQL同名变量怎么绑定

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

展开
收起
山海行 2023-07-05 18:07:38 80 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在 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 开始。

    2023-07-30 20:17:24
    赞同 展开评论 打赏
  • 我这里发现一个问题。如果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

    2023-07-06 10:45:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像