如何调用从 Java 代码返回 TABLE 类型的 postgresql 函数?

Posted

技术标签:

【中文标题】如何调用从 Java 代码返回 TABLE 类型的 postgresql 函数?【英文标题】:How to call postgresql function that returns TABLE type from Java code? 【发布时间】: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 代码调用此函数并访问该函数返回的数据? 我需要访问表记录并访问构成表记录的所有字段。

【问题讨论】:

【参考方案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   |
+----------------+-------------+--------------+

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

【讨论】:

以上是关于如何调用从 Java 代码返回 TABLE 类型的 postgresql 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何定义 swig 类型映射以将 unsigned char* 返回到 java

如何从方法返回匿名类型?

如何在java中调用包含用户定义类型的oracle存储过程?

来自 REST API 调用的 PowerBI XML 数据源有时会返回“表”数据类型

Android JNI之调用JAVA方法的返回值签名

java 调用cxfWebService 接口返回类型是xml格式数据显示在jsp页面中该如何做到