【问题标题】:How to call postgresql function that returns TABLE type from Java code?如何调用从 Java 代码返回 TABLE 类型的 postgresql 函数?
【发布时间】:2021-03-14 04:04:13
【问题描述】:

我有一个带有这个签名的 postgresql 函数...

create function getProductsPerCodes(p_c_prodcodes VARCHAR(1000))
RETURNS 
    table (prodcode VARCHAR(1000), prodname VARCHAR(1000), prodline VARCHAR(1000), prodvendor VARCHAR(1000), quantity_in_stock int)
AS

函数返回TABLE类型。

从 SQL 客户端,我可以这样调用这个函数:

select getProductsPerCodes('''c1'',''c4'',') rec

它可以很好地打印记录。

现在,如何从 Java 代码调用此函数并访问该函数返回的数据? 我需要访问表记录并访问构成表记录的所有字段。

【问题讨论】:

    标签: java postgresql jdbc


    【解决方案1】:

    你应该使用“表上下文语法”

    SELECT * FROM getProductsPerCodes($$'c1','c4',$$)
    

    当您的字符串包含引号 ' 时,您可以使用 Postgres 的自定义字符串分隔符,例如 $$。这样就不需要双引号,代码可读性更强。

    【讨论】:

    • 谢谢。我不熟悉“表上下文语法”。会查的。行情不是这里的问题。我不知道如何处理函数返回 TABLE 类型的事实。
    • @SamSarkar - 您可以像调用任何其他查询一样调用此查询
    【解决方案2】:

    处理集合返回函数的结果与处理常规select * from some_table 命令的结果没有什么不同。

    但您不应将参数作为 SQL 字符串的一部分传递。请改用PreparedStatement

    PreparedStatement pstmt = connection.prepareStatement("select * from getproductspercode(?,?)");
    pstmt.setString(1, "c1");
    pstmt.setString(2, "c4");
    ResultSet rs = pstmt.executeQuery();
    while (rs.next()) {
      String code = rs.getString("prodcode");
      String name = rs.getString("prodname");
      ... 
      int stock = rs.getInt("quantity_in_stock");
    }
    

    【讨论】:

      【解决方案3】:

      我整理了一个小的demo 来强化@a_horse_with_no_name 的声明,即“设置返回函数与处理常规选择的结果没有什么不同”。这个演示定义并填充了一个模仿你的小表格排序。它包含 2 个 TABLE 返回函数。然后它运行一个标准查询和每个函数,都具有相同的参数。您可以看到它们产生相同的结果。 (我使用逗号分隔的列表 :( 而不是您所拥有的 2 个参数。不必处理嵌套引号。(而且我最初误读了您的参数列表并且不想重做它们。)。

      然后我用不同的参数值 (c3,c1) 运行其中一个。它产生了以下内容:

      +----------------+-------------+--------------+
      |    pc_name     | pc_code_set | pc_code_grp  |
      +----------------+-------------+--------------+
      | Test col n= 01 | c1          | Group Low    |
      | Test col n= 03 | c3          | Group Low    |
      | Test col n= 06 | c1          | Group Medium |
      | Test col n= 08 | c3          | Group High   |
      | Test col n= 11 | c1          | Group High   |
      | Test col n= 13 | c3          | Group High   |
      +----------------+-------------+--------------+
      

      但运行的是哪一个,你无法判断。所以这里给你一个测试。在您的环境中构建它们并试一试。您将需要更改调用的内容,但不处理结果。

      【讨论】:

        猜你喜欢
        • 2019-08-03
        • 2014-08-21
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 2011-03-01
        • 1970-01-01
        相关资源
        最近更新 更多