如何使创建或替换函数function_name(param_name data_type)的行为在oracle和edb中相同?

ttvkxqim  于 2023-03-29  发布在  Oracle
关注(0)|答案(1)|浏览(140)

在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应该更新现有的函数,而不应该创建新的函数?

os8fio9y

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

DROP FUNCTION IF EXISTS schema_name.function_name(VARCHAR);
CREATE OR REPLACE FUNCTION schema_name.function_name(param_a VARCHAR, param_b INTEGER)
RETURNS some_type
AS $$
DECLARE
BEGIN
    -- body
END;
$$

在具有相同arity的函数签名中具有不同的参数类型并没有固有的问题。根据从客户端传递的类型,Postgres将选择正确的函数。因此,像下面这样具有两个签名是有效的:

CREATE OR REPLACE schema_name.function_name(param_a TEXT) ...
CREATE OR REPLACE schema_name.function_name(param_a INTEGER) ...

相关问题