【问题标题】:Dealing with PostgreSQL %ROWTYPE returns处理 PostgreSQL %ROWTYPE 返回
【发布时间】:2015-02-01 18:03:08
【问题描述】:

我有一个 PostgreSQL 函数,看起来像这样:

CREATE FUNCTION myFunc() returns myTable as $$
DECLARE
my_row myTable%ROWTYPE;
BEGIN
select * into strict my_row where......
return my_row
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION 'Blame the user !'
USING HINT = 'Its always the users fault !';
END;
$$ LANGUAGE plpgsql;

问题是,当我在 Java 中调用它并尝试从 ResultSet 中获取一个项目时,例如rs.getString(1),我没有得到该列,而是得到整个行表示,即rs.getString(1) 产生一个看起来像这样的字符串:

"("col1data","col2data",etc.等)"

我该如何正确地做到这一点?

【问题讨论】:

  • 请向我们展示您在 Java 代码中使用的 select 语句。
  • 我不确定我的函数 sql 查询是什么。它是一个标准的多列 SQL 查询,其中 * 作为列选择器和 where 子句中的主键。 Java 代码只调用“选择函数(参数)”,就像普通的 PostgreSQL 一样
  • 确实会影响您调用该函数的方式。
  • 好的,抱歉。帕维尔的回答清楚地表明了这一点。

标签: java postgresql jdbc dao plpgsql


【解决方案1】:

你得到了打包的复合值。你必须通过FROM 子句解压这个值

CREATE OR REPLACE FUNCTION public.fx()
RETURNS foo LANGUAGE plpgsql
AS $function$
BEGIN
  RETURN (SELECT ROW(a,b) FROM foo LIMIT 1);
END;
$function$

postgres=# SELECT * FROM foo;
 a  | b  
----+----
 10 | 20
(1 row)

postgres=# SELECT fx(); -- packed composite
   fx    
---------
(10,20)
(1 row)

postgres=# SELECT * FROM fx(); -- unpacked composite
 a  | b  
----+----
 10 | 20
(1 row)

【讨论】:

  • 谢谢帕维尔。会尝试您的建议并让您知道
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2011-03-01
  • 2011-05-08
相关资源
最近更新 更多