在Oracle数据库中,以下语法创建或替换函数function_name,即使我们只更改函数签名。(即函数的数据类型。如varchar到varchar 2)创建或替换函数function_name(numstr Varchar)//函数体/
但在edb/开放源码postgres的情况下,上述查询和更改将创建具有相同名称但不同数据类型的多个新函数。
SELECT oid::regprocedure FROM pg_proc WHERE proname = 'function_name';
oid
function_name(整数)function_name(字符)function_name(字符变化)(3行)
我在这里遗漏了什么,因为replace应该更新现有的函数,而不应该创建新的函数?
1条答案
按热度按时间os8fio9y1#
你可以使用
CREATE OR REPLACE schema_name.function_name(param_a VARCHAR, param_b TEXT)
。但是,你是对的,Postgres将允许重载函数。所以,如果你想摆脱一个与你试图CREATE OR REPLACE
的函数同名但签名不同的函数,你需要使用DROP FUNCTION IF EXISTS schema_name.function_name(param_a VARCHAR);
。我在repo中采用的策略是在新函数定义之前对旧函数签名调用
DROP
。在具有相同arity的函数签名中具有不同的参数类型并没有固有的问题。根据从客户端传递的类型,Postgres将选择正确的函数。因此,像下面这样具有两个签名是有效的: