2017-05-04 110 views
0

我写了如下的函数。函数返回记录类型还是什么都不返回?

Create function tmp (in text, in text) 
returns setof record as $$ 
Declare rec record; 
Begin 
If $1 is not null and $2 is null then 
Select * into rec from test_tble where tmprec = $1; 
Elsif $1 is not null and $2 is not null then 
Insert into test_tble values ($1,$2); 
End if; 
Return; 
End; $$ language plpgsql; 

我的问题是第二个条件。 第一个条件很好。 第二个条件成立时。我得到插入记录,但最后返回如下

$ 1 | $ 2

++++++

0行返回。

我不想用此列返回空记录。 任何人都可以帮助我从此恢复。

+0

你期待什么回报?.. –

+0

你可以使用INSERT ... RETURING *来获得插入的行。 - 但是您不必为此使用'plpgsql':它可以通过[数据修改CTE]来实现(https://www.postgresql.org/docs/current/static/queries-with.html#查询,这与修饰)。此外,(有些)新的['UPSERT'('INSERT ... ON冲突不做/更新)](https://www.postgresql.org/docs/current/static/sql-insert.html)功能似乎与你想达到的目标类似。 – pozs

+0

如果第一个条件满足需要返回记录其他条件满足,应该在tmp_tble中插入一条记录并结束 – Harini

回答

0

https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING

如果声明返回void的函数,返回语句可以用于提前退出函数 ;但不要在RETURN之后写出一个表达式 。

https://www.postgresql.org/docs/current/static/sql-createfunction.html

rettype

返回数据类型(任选模式修饰)。返回 类型可以是基本类型,复合类型或域类型,也可以引用表格列的 类型。根据实现语言的不同, 也可能被允许指定“pseudotypes”,如cstring。如果 函数是不应返回值,则指定void作为返回类型 。

(重点煤矿)

如果声明return void,你不能返回set of或任何其他收益。你也不能指定参数。所以你要么用函数返回一些东西,要么什么都不返回它不是由功能体控制的。

+0

谢谢你的回答@vao – Harini

+0

当然,希望它有帮助 –