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 并且无需强制转换即可正常工作。
这已在版本 10 中得到修复,如文档类型转换中所示:
前面几节中给出的规则将导致将非未知数据类型分配给 SQL 查询中的所有表达式,但显示为命令的简单输出列的未指定类型文字除外
SELECT。例如,在Run Code Online (Sandbox Code Playgroud)SELECT 'Hello World';没有任何东西可以确定字符串文字应该被视为什么类型。在这种情况下,PostgreSQL 将回退到将文字的类型解析为
text....
注意
在 PostgreSQL 10 之前,此规则不存在SELECT,并且输出列表中未指定类型的文字保留为 typeunknown。这造成了各种各样的不良后果,所以它被改变了。
为您提供的解决方案非常简单:
将值转换为text版本 10 或升级到版本 10。
| 归档时间: |
|
| 查看次数: |
2180 次 |
| 最近记录: |