Fonctions, overloading avec Oracle et PostgreSQL

La norme SQL évolue : tirez le meilleur d'un SGBD qui la respecte en écrivant du SQL moderne avec en complément PL/pgSQL, php, java etc.
Répondre
Phil
Administrateur du site
Messages : 263
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

Fonctions, overloading avec Oracle et PostgreSQL

Message 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.
Cdlt. Phil - pgphil.ovh
Répondre