PostgreSQL码农集散地

PostgreSQL 18 preview - PL/pgSQL 允许使用 => 语法为命名游标参数赋值兼容Oracle

PostgreSQL 18 preview - PL/pgSQL 允许使用 => 语法为命名游标参数赋值兼容Oracle

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=246dedc5d028800b393920184e5e6319c6805253

Allow => syntax for named cursor arguments in plpgsql.  
author Tom Lane <[email protected]>   
Mon, 3 Mar 2025 23:00:05 +0000 (18:00 -0500)  
committer Tom Lane <[email protected]>   
Mon, 3 Mar 2025 23:00:13 +0000 (18:00 -0500)  
commit 246dedc5d028800b393920184e5e6319c6805253  
tree 0339ce27b43220e3eb7f18adbbb417d61b5bc935 tree  
parent b6904afae40d94c2f34bc3c94aee1cdbe0bcfbe9 commit | diff  
Allow => syntax for named cursor arguments in plpgsql.  

We've traditionally accepted "name := value" syntax for  
cursor arguments in plpgsql.  But it turns out that the  
equivalent statements in Oracle use "name => value".  
Since we accept both forms of punctuation for function  
arguments, it makes sense to do the same here.  

Author: Pavel Stehule <[email protected]>  
Reviewed-by: Gilles Darold <[email protected]>  
Discussion: https://postgr.es/m/CAFj8pRA3d0ARQEMbABa1n6q25AUdNmyO8aGs56XNf9pD4sRMjQ@mail.gmail.com  

这个 patch 的主要目的是在 PL/pgSQL 中允许使用 => 语法来为命名游标参数赋值, 兼容Oracle用法。以下是该 patch 的详细解读:

背景

在 PL/pgSQL 中,传统上使用 name := value 语法来为游标参数赋值。然而,Oracle 数据库中使用的是 name => value 语法。由于 PostgreSQL 在函数参数中已经支持这两种语法形式(:= 和 =>),因此在游标参数中也支持这两种语法形式是合理的。

改动内容

  1. 语法支持:

  • 该 patch 允许在 PL/pgSQL 中使用 => 语法来为命名游标参数赋值。例如:
    OPEN cursor_name (param1 => value1, param2 => value2);  
  • 这与传统的 := 语法是等价的:
    OPEN cursor_name (param1 := value1, param2 := value2);  
  • 代码实现:

    • 该 patch 修改了 PL/pgSQL 的语法解析器,使其能够识别并处理 => 语法。
    • 具体来说,它扩展了 pl_gram.y 文件中的语法规则,以支持 => 作为命名参数赋值的另一种形式。
  • 兼容性:

    • 由于 PostgreSQL 在函数参数中已经支持 => 语法,因此在游标参数中也支持这种语法不会引入任何兼容性问题。
    • 这种改动使得 PL/pgSQL 的语法更加灵活,同时也提高了与 Oracle 数据库的兼容性。

    总结

    这个 patch 的主要目的是在 PL/pgSQL 中增加对 => 语法的支持,以便为命名游标参数赋值。这不仅提高了语法的灵活性,还增强了与 Oracle 数据库的兼容性。该改动是合理的,因为 PostgreSQL 在函数参数中已经支持这两种语法形式。