Postgresql 9.6 尝试让函数返回字符串而不先将其转换为字符串时出错。

BGC*_*CDC 5 postgresql datatypes functions postgresql-9.6

我正在学习 PostgreSQL (9.6) 并且对我收到的错误有点困惑。如果我尝试创建以下函数 II 会收到以下错误。

create or replace FUNCTION HelloWorld ()
RETURNS TABLE(HelloCol text, WorldCol text) AS $$

SELECT 'Hello' , 'World' ;
$$
 LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

错误:

    ERROR:  return type mismatch in function declared to return record
DETAIL:  Final statement returns unknown instead of text at column 1.
CONTEXT:  SQL function "helloworld"
SQL state: 42P13
Run Code Online (Sandbox Code Playgroud)

如果我将文本转换为文本,它可以正常工作。

create or replace FUNCTION HelloWorld ()
RETURNS TABLE(HelloCol text, WorldCol text) AS $$

SELECT cast('Hello' as text) , cast('World' as Text);
$$
 LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

我也在第一个场景中尝试了 char(10) 和 varchar(10) ,但也有同样的错误。我假设我只是在“TABLE(HelloCol text, WorldCol text)”部分没有得到正确的变量类型,但如果“Hello”不是文本、字符或 varchar,它是什么?只是一些未定义的类型?

我可以将返回的列更改为 int 并让它选择 1,2 并且无需强制转换即可正常工作。

ype*_*eᵀᴹ 3

这已在版本 10 中得到修复,如文档类型转换中所示:

SELECT输出列

前面几节中给出的规则将导致将非未知数据类型分配给 SQL 查询中的所有表达式,但显示为命令的简单输出列的未指定类型文字除外SELECT。例如,在

 SELECT 'Hello World';
Run Code Online (Sandbox Code Playgroud)

没有任何东西可以确定字符串文字应该被视为什么类型。在这种情况下,PostgreSQL 将回退到将文字的类型解析为text.

...

注意
在 PostgreSQL 10 之前,此规则不存在SELECT,并且输出列表中未指定类型的文字保留为 typeunknown。这造成了各种各样的不良后果,所以它被改变了。


为您提供的解决方案非常简单:

将值转换为text版本 10 或升级到版本 10。