Vous n'êtes pas identifié(e).
Bonjour,
Je suis nouveau et je suis confronter à un problème dans un de mes premier script sql.
Voici le détail :
Table : table
id;societe;name
1;DCNS;PrésentationDCNS
2;SNCF;PrésentationSNCF
3;THALES;PrésentationTHALES
4;SDMO;PrésentationSDMO
Je souhaite écrire un script qui quand le technicien rentrera la société voulue, il en aura la présentation. Voici le script :
CREATE OR REPLACE FUNCTION test (selection charater varying) RETURNS AS character varying $BODY$
DECLARE
var varchar;
BEGIN
var := selection;
COPY (SELECT name FROM table WHERE name = var) TO 'D:/_users/BMI/test00.txt';
RETURN var;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
SELECT test('2');
Le problème est la confirmation de l'égalité entre name et var.
Dernière modification par BastienM (03/05/2017 16:19:02)
Hors ligne
Serait-il possible de m'aider ?
Cordialement
BastienM
Hors ligne
La fonction doit faire quoi exactement ? Ce n'est pas très clair ?
Vous voulez lui passer un id et qu'elle vous retourne le nom de la société ?
Marc.
Hors ligne
Je m'excuse, je me suis trompé, je souhaitais mettre SELECT('SNCF');
Le script sql doit retourner donc SNCF et créer un fichier txt qui a écrit à l'intérieur PrésentationSNCF.
Cordialement
BastienM
Hors ligne
Si on fait abstraction des petites erreurs de syntaxe (je présume que ce n'est pas la fonction de départ), le problème principal, c'est que COPY n'est pas utilisable comme une requête préparée avec des paramètres (contrairement à SELECT, INSERT, UPDATE, DELETE). Il faut donc fabriquer dynamiquement une chaîne et la passer à execute. J'ai changé le chemin vers le fichier étant donné que je suis sur un système Unix:
CREATE OR REPLACE FUNCTION test (selection character varying) RETURNS character varying AS
$BODY$
DECLARE
BEGIN
EXECUTE format('COPY (SELECT name FROM ma_table WHERE societe=%1L) TO ''/tmp/test00.txt''',selection);
RETURN selection;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
;
Je ne sais pas si envoyer les informations dans un fichier texte, c'est une bonne idée, par contre. Ça dépend vraiment de votre cas d'utilisation, mais c'est rare d'en avoir vraiment besoin.
Pour une explication de la fonction format, https://www.postgresql.org/docs/9.5/sta … ING-FORMAT
Marc.
Hors ligne
Je te remercie. Ça fonctionne, par contre j'aimerais savoir à quoi correspond le %1L (si je met un 2, ça correspond à une deuxième variable d'entrée?) ?
Cordialement
BastienM
PS : comment met-on une discussion en résolu ?
Hors ligne
%1L c'est pour premier paramètre, L voulant dire que c'est un «litteral», c'est à dire une valeur.
Pour la discussion, change juste le titre
Marc.
Hors ligne