在 postgresql 存储过程中,静态 sql 优于动态 sql 吗?

Is static sql to be preferred over dynamic sql in postgresql stored procedures?

我不确定在存储过程的情况下,如果 Postgresql 对待静态 sql 与作为引用字符串提交的查询有任何不同。

当我在 PostgreSQL 中使用静态 sql 创建存储过程时,似乎没有验证 table 名称和 table 列或列类型,但是当我 运行 如果有的话,我会得到问题列表的程序。

open ref_cursor_variable for
select usr_name from usres_master; 

-- 这是打字错误。 table 名称应为 users_master。但是创建了存储过程并且仅当我 运行 该过程时才会抛出错误。

当我 运行 程序时,我(自然地)得到一些错误,如:

table usres_master - invalid table name

以上是普通版本。我们在工作中使用的真实程序结合了几个 table 和 运行 至少几百行。在 PostgresQL 存储过程中,使用静态 sql 优于动态 sql 是否没有优势,即像 open ref_cursor_variable for EXECUTE select_query_string_variable.

函数的源只是 Postgres 的一个字符串。这样做的主要原因是 Postgres(与其他 DBMS 不同)支持许多甚至可安装的函数和过程语言。由于 Postgres 核心不可能知道所有语言的语法,因此它无法验证函数的 "inner" 部分。据我所知,"language API" 不包含任何 "validate" 方法(理论上这可能是可行的)。

如果您想静态验证您的 PL/pgSQL 函数(以及自 Postgres 11 以来的过程),您可以使用例如https://github.com/okbob/plpgsql_check/

静态 SQL 几乎是首选 - 动态 SQL 应仅在必要时使用

  • 出于性能原因(动态 SQL 不重用执行计划)。一次计划有时会更好(而且是必要的)。
  • 可以减少很多代码

在其他情况下每次都使用静态 SQL。好处:

  • 可读性
  • 重复使用执行计划
  • 默认情况下可以安全地防止 SQL 注入
  • 静态检查可用