如何让Oracle与EDB中CREATE OR REPLACE FUNCTION行为一致?
Oracle与PostgreSQL/EDB中
CREATE OR REPLACE FUNCTION的行为差异解析 现象对比
Oracle的执行逻辑
在Oracle数据库中,使用CREATE OR REPLACE FUNCTION语法时,即便仅修改函数签名(比如参数数据类型从Varchar改为Varchar2),也会直接替换原有函数。示例代码:
create or replace function function_name(numstr Varchar) -- 函数体 /
PostgreSQL/EDB的执行逻辑
但在EDB或开源PostgreSQL中,执行修改签名后的CREATE OR REPLACE FUNCTION语句,不会替换原有函数,而是创建多个同名但参数数据类型不同的函数。
执行查询验证:
SELECT oid::regprocedure FROM pg_proc WHERE proname = 'function_name';
返回结果示例:
oid function_name(integer) function_name(character) function_name(character varying) (3 rows)
核心原因
PostgreSQL(含EDB)支持函数重载,这是导致差异的关键:
- PostgreSQL中,函数的唯一性由「函数名+完整参数列表(包含每个参数的数据类型)」共同判定,只要参数列表不同,就被视为独立的函数。
CREATE OR REPLACE FUNCTION在PostgreSQL中的规则是:仅当存在一个完全匹配(函数名、参数数量、每个参数类型都一致)的函数时,才会替换它;如果没有完全匹配的函数,就会新增一个重载函数。
而Oracle不支持函数重载,同名函数必须完全匹配签名,因此CREATE OR REPLACE FUNCTION会直接替换同名的现有函数,不管签名是否变更。
内容的提问来源于stack exchange,提问作者MD NASEEM
相关产品推荐
相关产品推荐

