Java 处理PostgreSQL%ROWTYPE返回

Java 处理PostgreSQL%ROWTYPE返回,java,postgresql,jdbc,dao,plpgsql,Java,Postgresql,Jdbc,Dao,Plpgsql,我有一个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 a

我有一个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中调用它并尝试从结果集中获取一个项时,例如,
rs.getString(1)
,我没有获取该列,而是获取整个行表示,即,
rs.getString(1)
生成一个如下所示的字符串:

(“col1data”、“col2data”等)


如何正确执行此操作?

您得到了压缩复合值。您必须通过
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)

你得到了压缩复合值。您必须通过
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)

请向我们展示您在Java代码中使用的
select
语句。我不确定我的sql查询函数是什么。这是一个标准的多列SQL查询,其中*作为列选择器,在where子句中作为主键。Java代码只调用“select function(Params)”,正如正常的PostgreSQLIt所说,调用该函数的方式确实有所不同。Pavel的回答清楚地说明了这一点。请向我们展示您在Java代码中使用的
select
语句。我不确定我的sql查询函数是什么。这是一个标准的多列SQL查询,其中*作为列选择器,在where子句中作为主键。Java代码只调用“select function(Params)”,正如正常的PostgreSQLIt所说,调用该函数的方式确实有所不同。帕维尔的回答很清楚,谢谢帕维尔。我会试试你的建议,让你知道谢谢帕维尔。我会尝试你的建议并让你知道