You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:42:05