postgresql - 在创建函数时有什么方法可以使 Postgres 更严格?

标签 postgresql

我们最近开始使用 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/

相关文章:

sql - 如何获取最小和最大请求​​的时间?

python - 从数据文件启动 postgres 数据库服务器

postgresql - Postgres SELECT 数组中的值

Javascript Promise Chaining - 它被接受了吗?

java - 将数据库类型映射到具体的 Java 类

postgresql - 防止 CTE 查询的 Postgres 规则

mysql - SQL,如何测试并发事务

postgresql - postgres 和 docker-compose : can't create a custom role and database

PostgreSQL:获取记录平均值的有效方法

python - 使用 PostGIS 数据库测试 GeoDjango 应用程序