我们最近开始使用 Postgres,从 SQL Server 迁移过来。我注意到 Postgres 解析器/编译器允许创建(在我看来)可以在创建时拒绝的函数。
我所说的一个例子是 plpgsql block 中的 select 语句:
create or replace function test() returns void as $$
begin
select * from pg_database;
end;
$$ language plpgsql;
此函数在运行时失败,“查询没有结果数据的目的地”。为什么这个错误不会在函数创建时被捕获?是否允许在 plpgsql block 中使用不带 'return' 的 select?
另一种并非总能在编译时捕获的错误类型是声明的返回类型与值的实际类型之间的类型不匹配错误。这些在简单的情况下被捕获,但开始在更复杂的函数中进入运行时。我怀疑 Postgres 类型推断/分析存在一些限制,是否有关于此的任何其他信息可用?
tldr:有没有办法让 Postgres 解析器/编译器在创建函数时失败更多?
最佳答案
Is there any way to make Postgres parser/compiler fail more on function creation?
这就是 plpgsql_check
的目的延期。不过,它不会阻止创建函数。
test=# create extension plpgsql_check;
CREATE EXTENSION
test=# create or replace function test() returns void as $$
begin
select * from pg_database;
end;
$$ language plpgsql;
test=# select * from plpgsql_check_function('test');
plpgsql_check_function
----------------------------------------------------------------------
error:42601:3:SQL statement:query has no destination for result data
关于postgresql - 在创建函数时有什么方法可以使 Postgres 更严格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62475251/