Fonctions, overloading avec Oracle et PostgreSQL
Posté : ven. 20 mars 2020 15:22
Merci à Yves pour sa question :
"Je dois créer plusieurs fonctions avec Oracle PLSQL et PostgreSQL PLPGSQL. Elles doivent avoir le même nom mais le type du paramètre change. Est-ce possible ?"
Réponse :
Il est préférable d'éviter cela. En dehors de cas simples, attention aux règles de préséance pour être certain que la bonne fonction est appliquée.
Mais, oui, c'est possible, à la fois avec PostgreSQL et Oracle.
Exemple avec PostgreSQL 11 :
Avec Oracle, un package est nécessaire, exemple avec la version 19c :
Note : il serait possible avec PostgreSQL de créer un schéma portant le nom utilisé pour le package Oracle afin d'avoir la même syntaxe dans les requêtes SQL.
"Je dois créer plusieurs fonctions avec Oracle PLSQL et PostgreSQL PLPGSQL. Elles doivent avoir le même nom mais le type du paramètre change. Est-ce possible ?"
Réponse :
Il est préférable d'éviter cela. En dehors de cas simples, attention aux règles de préséance pour être certain que la bonne fonction est appliquée.
Mais, oui, c'est possible, à la fois avec PostgreSQL et Oracle.
Exemple avec PostgreSQL 11 :
Code : Tout sélectionner
select version();
version
----------------------------------------------------------------------------------------------------------------
PostgreSQL 11.7 (Debian 11.7-0+deb10u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
create or replace function test(text) returns text as
$$
begin
return 'TEXTE !';
end;
$$ LANGUAGE PLPGSQL;
create or replace function test(integer) returns text as
$$
begin
return 'ENTIER !';
end;
$$ LANGUAGE PLPGSQL;
select test('toto');
test
---------
TEXTE !
select test(0);
test
----------
ENTIER !
Code : Tout sélectionner
Live SQL 19.4.2, running Oracle Database 19c Enterprise Edition - 19.5.0.0.0
create or replace package touslestests
is
function test(val in varchar2) return varchar2;
function test(val in integer) return varchar2;
end;
create or replace package body touslestests
is
function test(val in varchar2) return varchar2 as
begin
return 'TEXTE !';
end;
function test(val in integer) return varchar2 as
begin
return 'ENTIER !';
end;
end;
select touslestests.test('toto') from dual;
TOUSLESTESTS.TEST('TOTO')
TEXTE !
select touslestest.test(0) from dual;
TOUSLESTESTS.TEST(0)
ENTIER !