Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tous et à toutes,
Je débute sur postgresql et je bloque sur un point qui me semble pourtant simple (du moins simple sur SQL Server).
Je cherche dans une procédure à créer une table temporaire avec un nom spécifique selon des paramètres passés à ma procédure (la procédure pouvant être appelée par plusieurs utilisateurs il me faut un nom différent à chaque utilisateur).
Je fais la concaténation de trois chaines pour nommer ma table temporaire mais quand j'appelle ma table elle porte le nom de ma variable et non pas sa valeur.
Ci-joint le début du code que j'ai épuré un peu pour être plus simple à lire :
CREATE OR REPLACE PROCEDURE public.proc_recherchepiecesselonfournisseursetdepot(
scodefournisseur character varying, scodedepot character varying, sutilisateur character varying)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
Reference varchar(20);
sNomTableTemp varchar(50);
curseur_Fournisseur CURSOR FOR
SELECT
"Reference"
FROM "PIECE"
WHERE "CodeFournisseur" = scodefournisseur
AND "CodeDepot" = scodedepot;
BEGIN
sNomTableTemp = CONCAT(scodefournisseur, '_', scodedepot, '_', sutilisateur);
DROP TABLE IF EXISTS sNomTableTemp;
CREATE TEMPORARY TABLE sNomTableTemp (
Reference varchar(20)
);
... etc
Ensuite je travaille sur mon curseur pour insérer les données dans ma table temporaire.
Ensuite j'exécute ma procédure avec des paramètres :
CALL proc_RecherchePiecesFournisseurSelondepot('AZ', 'AAA', 'Yves');
Quand je veux voir mes données cela marche avec SELECT * FROM "sNomTableTemp"; mais pas avec SELECT * FROM "AZ_AAA_Yves";
Dans la procédure que je mette ou pas les "" c'est la même chose.
Quelqu'un aurait-il une idée de la bonne méthode ou d'où mon problème peut venir ?
Merci d'avance pour votre aide.
Yves.
Hors ligne
Postgres ne gère pas de variable dans le DDL, il faut exécuter une requête dynamique. Quelquechose comme
EXECUTE format('CREATE TEMPORARY TABLE %I (...)', sNomTableTemp);
Julien.
https://rjuju.github.io/
Hors ligne
Merci Julien, c'est nickel.
Yves.
Hors ligne
Pages : 1