如何通过手动查询重现:[Amazon](500310) 无效操作:找不到从“未知”到整数的转换函数;

Posted

技术标签:

【中文标题】如何通过手动查询重现:[Amazon](500310) 无效操作:找不到从“未知”到整数的转换函数;【英文标题】:How to reproduce with a manual query: [Amazon](500310) Invalid operation: failed to find conversion function from "unknown" to integer; 【发布时间】:2020-07-03 16:44:10 【问题描述】:

我最近在 Dropwizard 项目中添加了一个 maven 依赖项:

        <dependency>
            <groupId>com.amazon.redshift</groupId>
            <artifactId>redshift-jdbc42-no-awssdk</artifactId>
            <version>1.2.45.1069</version>
        </dependency>

它正在替换以前使用的org.postgresql.Driver,从那时起我的一些查询返回

! Causing: org.skife.jdbi.v2.exceptions.UnableToCreateStatementException: java.sql.SQLException: [Amazon](500310) Invalid operation: failed to find conversion function from "unknown" to integer;

我怀疑我可能有几十个查询需要适应新驱动程序。

因为我不想每次想要测试对查询的更改是否能解决问题时都必须重新启动服务器,所以我想针对 Redshift DB 手动运行查询,以便快速识别需要修复的部分查询。

我的问题:从 IntelliJ DB 控制台中手动运行查询时,我无法重现该错误。我什至从https://docs.aws.amazon.com/redshift/latest/mgmt/configure-jdbc-connection.html(我下载了这个:https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/1.2.45.1069/RedshiftJDBC42-no-awssdk-1.2.45.1069.jar)下载了 Amazon Redshift 驱动程序的 JAR,并用它在 IntelliJ 中建立了一个新的数据库连接。但是,从 IntelliJ DB 控制台手动运行完全相同的查询不会给我错误。

与从控制台手动运行相比,任何人都可以想到在服务器运行时可能导致查询出错的配置是什么?以及如何让它停止在服务器上抛出异常或在控制台中运行时开始导致相同的错误?

【问题讨论】:

【参考方案1】:

我假设问题出在 JDBI 和 Amazon Redshift 驱动程序之间。无论如何,这里有一个暂时解决问题的修复程序:

对于这样的查询:

    //language=PostgreSQL
public static final String MY_QUERY = "" +
    "WITH my_table(someid, groupname) AS (\n" +
    "    SELECT :someId, :groupName\n" +
    ")\n" +
    "SELECT 'something'\n" +
    "FROM my_table mt\n" +
    "FULL OUTER JOIN another_table at ON at.accountid = mt.someid AND at.groupname = mt.groupname";

添加\\:\\:int 摆脱了错误:

    //language=PostgreSQL
public static final String MY_QUERY = "" +
    "WITH my_table(someid, groupname) AS (\n" +
    "    SELECT :someId\\:\\:int, :groupName\\:\\:text\n" +
    ")\n" +
    "SELECT 'something'\n" +
    "FROM my_table mt\n" +
    "FULL OUTER JOIN another_table at ON at.accountid = mt.someid AND at.groupname = mt.groupname";

【讨论】:

以上是关于如何通过手动查询重现:[Amazon](500310) 无效操作:找不到从“未知”到整数的转换函数;的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon EMR 上将连接器添加到 presto

如何在 Amazon Athena 上查询(搜索)具有 JSON 值的 sql?

如何通过 SQL Workbench 将 Amazon Redshift 输出保存到本地 CSV?

如何从 Amazon Athena 查询镶木地板数据?

何时通过 AWS Glue ETL 使用 Amazon Redshift 频谱来查询 Amazon S3 数据

启动 Amazon EC2 实例时如何自动启动 Web 服务?