首页 > 解决方案 > 如何通过 Kotlin 在 Redshift JDBC PreparedStatement 中使用和设置数组

问题描述

我有一个使用 Redshift JDBC PreparedStatement 的 Kotlin 代码,但参数似乎没有正确插入到语句中。当我通过它插入.replace("?", "something")时。

此代码不起作用(我正在使用准备好的语句并设置数组):

val existingContacts =
    redshiftClient.prepareStatement(
        "SELECT contact_id, email FROM some.table WHERE email IN (?)"
    )
        .use { ps ->
            ps.setArray(1, redshiftClient.createArrayOf("VARCHAR", dataToInsert.mapNotNull { it["email"] }.toTypedArray()))
            ps.executeQuery().use { rs ->
                mutableListOf<Pair<String, Map<String, String?>>>().apply {
                    while (rs.next()) {
                        add(rs.getString("contact_id") to dataToInsert.first { d -> d["email"] == rs.getString("email") })
                    }
                }
            }
        }

此代码正在工作(我自己插入数组):

val existingContacts =
    redshiftClient.prepareStatement(
        "SELECT contact_id, email FROM some.table WHERE email IN (?)"
            .replace(
                "?",
                dataToInsert.mapNotNull { it["email"] }.joinToString(
                    separator = "','",
                    prefix = "'",
                    postfix = "'"
                )
            )
    )
        .use { ps ->
            ps.executeQuery().use { rs ->
                mutableListOf<Pair<String, Map<String, String?>>>().apply {
                    while (rs.next()) {
                        add(rs.getString("contact_id") to dataToInsert.first { d -> d["email"] == rs.getString("email") })
                    }
                }
            }
        }

如果我使用另一个 SQL 查询,例如SELECT contact_id, email FROM some.table WHERE email IN ?(不带括号?),我得到一个错误:

java.sql.SQLException: [Amazon](500310) Invalid operation: syntax error at or near "$1" 
Position: 63;

你看到错误的位置了吗?

无论如何,您知道我如何使用 Redshift JDBC 打印 PreparedStatement 吗?println(ps.toString())不工作,实施了吗?

谢谢,

标签: kotlinjdbcprepared-statementamazon-redshift

解决方案


推荐阅读