Sql t所有这些都不会改变函数的签名。返回指定的类型就足够了。不要使用新类型来解决此问题。只需使用一条记录并在记录中对成员进行别名。有关不涉及自定义类型的更正确答案,请参阅。是否调查了返回多条记录,例如返回我的集合_type@nate:它不是返回集合的函数。我需
Sql t所有这些都不会改变函数的签名。返回指定的类型就足够了。不要使用新类型来解决此问题。只需使用一条记录并在记录中对成员进行别名。有关不涉及自定义类型的更正确答案,请参阅。是否调查了返回多条记录,例如返回我的集合_type@nate:它不是返回集合的函数。我需,sql,postgresql,stored-procedures,types,plpgsql,Sql,Postgresql,Stored Procedures,Types,Plpgsql,t所有这些都不会改变函数的签名。返回指定的类型就足够了。不要使用新类型来解决此问题。只需使用一条记录并在记录中对成员进行别名。有关不涉及自定义类型的更正确答案,请参阅。是否调查了返回多条记录,例如返回我的集合_type@nate:它不是返回集合的函数。我需要获取SP中的记录,然后从从从函数返回的数据中检索检索到的集合中的单个记录中的字段-sounnds比实际情况更复杂-请参阅上面的代码。。我想知道如何再次分割这张唱片。。。谢谢@肖恩:回答得很好,谢谢-我要试试这个。把最后一个例子中的结果分开是很
t所有这些都不会改变函数的签名。返回指定的类型就足够了。不要使用新类型来解决此问题。只需使用一条记录并在记录中对成员进行别名。有关不涉及自定义类型的更正确答案,请参阅。是否调查了返回多条记录,例如返回我的集合_type@nate:它不是返回集合的函数。我需要获取SP中的记录,然后从从从函数返回的数据中检索检索到的集合中的单个记录中的字段-sounnds比实际情况更复杂-请参阅上面的代码。。我想知道如何再次分割这张唱片。。。谢谢@肖恩:回答得很好,谢谢-我要试试这个。把最后一个例子中的结果分开是很酷的。@Sean:谢谢。我发现选择a,b,c。。。非常有用。如何将该方法用于以下内容:选择代码,表格中的函数代码;,我从表中而不是函数中选择的位置?@Sean:1。自Postgres 9.2以来,普通SQL语句也被重新规划。2.返回类型与执行与否无关。3.答案中的技术仅适用于单行结果,而不适用于记录集。4.如果您的返回类型与示例中一样是常量,请使用已知类型。使用匿名记录的想法只有在返回类型不同的少数情况下才有意义。如果查询结果为0,会发生什么情况?即使预期返回0行,该函数仍将返回一行ret记录。我发现该函数不返回复合类型•使用Hasura尝试此操作时,该函数不返回一组表。@marcellothearcane:这些函数的工作方式与公布的一样。请看添加的。谢谢,我想这是Hasura的问题-我正在返回一组似乎有效的!
CREATE OR REPLACE FUNCTION get_object_fields(name text)
RETURNS RECORD AS $$
BEGIN
-- fetch fields f1, f2 and f3 from table t1
-- fetch fields f4, f5 from table t2
-- fetch fields f6, f7 and f8 from table t3
-- return fields f1 ... f8 as a record
END
$$ language plpgsql;
CREATE TABLE user (id int, school_id int, name varchar(32));
CREATE TYPE my_type AS (
user1_id int,
user1_name varchar(32),
user2_id int,
user2_name varchar(32)
);
CREATE OR REPLACE FUNCTION get_two_users_from_school(schoolid int)
RETURNS my_type AS $$
DECLARE
result my_type;
temp_result user;
BEGIN
-- for purpose of this question assume 2 rows returned
SELECT id, name INTO temp_result FROM user where school_id = schoolid LIMIT 2;
-- Will the (pseudo)code below work?:
result.user1_id := temp_result[0].id ;
result.user1_name := temp_result[0].name ;
result.user2_id := temp_result[1].id ;
result.user2_name := temp_result[1].name ;
return result ;
END
$$ language plpgsql
CREATE OR REPLACE FUNCTION get_object_fields
(
name text
)
RETURNS mytable
AS
$$
DECLARE f1 INT;
DECLARE f2 INT;
…
DECLARE f8 INT;
DECLARE retval mytable;
BEGIN
-- fetch fields f1, f2 and f3 from table t1
-- fetch fields f4, f5 from table t2
-- fetch fields f6, f7 and f8 from table t3
retval := (f1, f2, …, f8);
RETURN retval;
END
$$ language plpgsql;
CREATE OR REPLACE FUNCTION get_object_fields(name text)
RETURNS TABLE (f1 varchar(10), f2 varchar(10) /* , ... */ )
...
CREATE FUNCTION test_ret(a TEXT, b TEXT) RETURNS RECORD AS $$
DECLARE
ret RECORD;
BEGIN
-- Arbitrary expression to change the first parameter
IF LENGTH(a) < LENGTH(b) THEN
SELECT TRUE, a || b, 'a shorter than b' INTO ret;
ELSE
SELECT FALSE, b || a INTO ret;
END IF;
RETURN ret;
END;$$ LANGUAGE plpgsql;
test=> SELECT test_ret('foo','barbaz');
test_ret
----------------------------------
(t,foobarbaz,"a shorter than b")
(1 row)
test=> SELECT test_ret('barbaz','foo');
test_ret
----------------------------------
(f,foobarbaz)
(1 row)
CREATE FUNCTION test_ret(a TEXT, b TEXT) RETURNS RECORD AS $$
DECLARE
ret RECORD;
BEGIN
-- Note the CASTING being done for the 2nd and 3rd elements of the RECORD
IF LENGTH(a) < LENGTH(b) THEN
ret := (TRUE, (a || b)::TEXT, 'a shorter than b'::TEXT);
ELSE
ret := (FALSE, (b || a)::TEXT, NULL::TEXT);
END IF;
RETURN ret;
END;$$ LANGUAGE plpgsql;
test=> SELECT test_ret('foobar','bar');
test_ret
----------------
(f,barfoobar,)
(1 row)
test=> SELECT test_ret('foo','barbaz');
test_ret
----------------------------------
(t,foobarbaz,"a shorter than b")
(1 row)
test=> SELECT a, b, c FROM test_ret('foo','barbaz') AS (a BOOL, b TEXT, c TEXT);
a | b | c
---+-----------+------------------
t | foobarbaz | a shorter than b
(1 row)
test=> SELECT a, b, c FROM test_ret('foobar','bar') AS (a BOOL, b TEXT, c TEXT);
a | b | c
---+-----------+---
f | barfoobar |
(1 row)
CREATE OR REPLACE FUNCTION get_object_fields(_school_id int
, OUT user1_id int
, OUT user1_name varchar(32)
, OUT user2_id int
, OUT user2_name varchar(32)) AS
$func$
BEGIN
SELECT INTO user1_id, user1_name
u.id, u.name
FROM users u
WHERE u.school_id = _school_id
LIMIT 1; -- make sure query returns 1 row - better in a more deterministic way?
user2_id := user1_id + 1; -- some calculation
SELECT INTO user2_name
u.name
FROM users u
WHERE u.id = user2_id;
END
$func$ LANGUAGE plpgsql;
SELECT * FROM get_object_fields(1);
CREATE OR REPLACE FUNCTION get_object_fields2(_school_id int)
RETURNS TABLE (user1_id int
, user1_name varchar(32)
, user2_id int
, user2_name varchar(32)) AS
$func$
BEGIN
RETURN QUERY
SELECT u1.id, u1.name, u2.id, u2.name
FROM users u1
JOIN users u2 ON u2.id = u1.id + 1
WHERE u1.school_id = _school_id
LIMIT 1; -- may be optional
END
$func$ LANGUAGE plpgsql;
SELECT * FROM get_object_fields2(1);
CREATE OR REPLACE FUNCTION get_object_fields(my_name text, OUT f1 text, OUT f2 text)
AS $$
SELECT t1.name, t2.name
FROM table1 t1
CROSS JOIN table2 t2
WHERE t1.name = my_name AND t2.name = my_name;
$$ LANGUAGE SQL;
select get_object_fields( 'Pending') ;
get_object_fields
-------------------
(Pending,code)
(1 row)
select * from get_object_fields( 'Pending');
f1 | f
---------+---------
Pending | code
(1 row)
select (get_object_fields( 'Pending')).f1;
f1
---------
Pending
(1 row)
CREATE OR REPLACE FUNCTION schemaName.get_two_users_from_school(schoolid bigint)
RETURNS SETOF record
LANGUAGE plpgsql
AS $function$
begin
return query
SELECT id, name FROM schemaName.user where school_id = schoolid;
end;
$function$