Page 1 sur 1

Fonctions, overloading avec Oracle et PostgreSQL

Posté : ven. 20 mars 2020 15:22
par Phil
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 :

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 !
Avec Oracle, un package est nécessaire, exemple avec la version 19c :

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 !

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.