我有一个功能:
CREATE OR REPLACE FUNCTION my_function(user_id BIGINT) RETURNS BIGINT AS
$BODY$
DECLARE
var1 ???; --- ???
BEGIN
--1
var1 := (SELECT table1.field1, table2.field2
FROM table1
INNER JOIN table2
-- ......
);
--2
--if var1 is not null...
首先,我希望var1
成为一个元组。我必须创建一个这样的类型吗?
CREATE TYPE my_type ....
哪个有两个字段?或者也许有更好的方法来解决这个问题?
其次,我想确保var1
不为空。怎么能这样做?
答案 0 :(得分:1)
您可以 create a TYPE
或使用现有表格的类型。然后使用RETURNS SETOF my_type
。
但对于行类型,您只需要在单个函数中使用RETURNS TABLE (...)
更方便 - 可能与RETURN QUERY
结合使用:
CREATE OR REPLACE FUNCTION my_function(user_id bigint)
RETURNS TABLE(field1 int, field2 text) AS -- replace with actual types!
$func$
BEGIN
RETURN TABLE
SELECT t1.field1, t2.field2 -- table-qualify to avoid naming conflict
FROM table1 t1
JOIN table2 t2 ON ...
... ;
-- if var1 is not null ...
IF NOT FOUND THEN
-- If nothing was found, you can ...
-- RAISE EXCEPTION 'foo!' -- to raise an exception. Or ...
-- RETURN QUERY SELECT 1, 'foo'; -- return a "default" row ...
END IF;
END
$func$ LANGUAGE plpgsql;
在plpgsql标记中搜索这些关键字。有很多例子。