PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 13/08/2017 23:13:02

skylendar
Membre

create type et les fonctions INPUT et OUTPUT

D'abord bonsoir Messieurs et merci de lire ce message et d'y répondre si vous pouvez.

je tente de créer un nouveau type composite et d'y associer 2 fonctions en plpgsql pour initialiser un champ de ce type depuis et vers une chaîne de caractères.

La documentation postgres sql-createtype publie un exemple explicatif.(voir CREATE TYPE  box)

Malheureusement, il y a un pépin.

Lorsqu'on déclare une fonction INPUT p.ex.

CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;

comme dans l'exemple cité ci-dessus, cette déclaration est rejetée parce que le type de retour (box) est un shell, c'est-à-dire une déclaration préliminaire et on ne peut déclarer une fonction retournant un tel type. En fait, c'est logique. On ne peut créer et manipuler une variable d'un type non encore défini.

Donc l'exemple donné n'est pas valide. Mais cela n'indique pas comment il faut faire. Essayez l'exemple de la doc...

Avez-vous une idée ?

Merci encore de lire ce message.

Hors ligne

#2 14/08/2017 07:11:36

rjuju
Administrateur

Re : create type et les fonctions INPUT et OUTPUT

L'exemple devrait marcher, cela vient je pense plutôt du fait qu'un type box existe déjà.  Si vous reprenez l'exemple en changeant le nom la création fonctionne :

create type my_box;

CREATE FUNCTION my_box_in_function(cstring) RETURNS my_box language internal immutable AS $$box_in$$ ;
CREATE FUNCTION my_box_out_function(my_box) RETURNS cstring language internal immutable AS $$box_out$$ ;

CREATE TYPE my_box (
    INTERNALLENGTH = 16,
    INPUT = my_box_in_function,
    OUTPUT = my_box_out_function
);

Hors ligne

#3 15/08/2017 22:32:14

skylendar
Membre

Re : create type et les fonctions INPUT et OUTPUT

Les fonctions INPUT et OUTPUT doivent être rédigées en C en non en plpgsql, C'ếtait ça mon erreur.

Là-dessus, j'ai en effet écrit deux fonctions placées fans un objet partagé, et ça marche...

Merci malgré tout de l'aide apportée

Hors ligne

Pied de page des forums