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).

#26 Re : Général » Accès aux paramètres d'une fonction à l'intérieur d'un PREPARE » 19/08/2011 14:19:50

Ça fonctionne!

C'est bon à savoir que PREPARE n'est pas obligatoire pour les tables temporaires ponctuelles comme j'ai eu besoin de faire.

Merci beaucoup dverite pour les explications

#27 Général » Accès aux paramètres d'une fonction à l'intérieur d'un PREPARE » 18/08/2011 19:31:38

charleydc5
Réponses : 3

Bonjour à tous,

J'ai une fonction qui contient une table temporaire, donc un "PREPARE" suivi d'un SELECT et de la commande CREATE TEMP TABLE.

J'avais le message suivant à l'exécution:

ERROR:  could not determine data type of parameter $2
CONTEXT:  SQL statement "PREPARE tmpCas AS

J'ai donc découvert qu'il fallait spécifier les types de paramètre dans une instruction PREPARE, car autrement PostgreSQL les perçoit comme "unknown".

Mon instruction PREPARE est donc passée de

PREPARE tmpCas AS

à

PREPARE tmpCas(integer, character varying, character varying, integer, character varying, integer, character varying, character varying, integer, integer, character varying) AS

Maintenant, mon erreur n'est plus la même. C'est maintenant :

ERROR:  operator does not exist: timestamp without time zone >= character varying
LINE 71:     stirq.Cheminement.datCheminement BETWEEN $3 AND $4 AND

Lorsque j'arrive à la ligne en question, je remarque PostgreSQL perçoit $3 et $4 comme le troisième et le quatrième paramètre de mon PREPARE (donc character varying et integer), alors que ma fonction a comme troisième et quatrième paramètre des timestamp (intervalle de date pour ma requête).

Lorsque je ne suis pas dans un prepare, c'est parfait. Par contre, dans un PREPARE, je n'arrive plus à accéder aux paramètres de ma fonction.

J'ai essayé d'ajouter ceci au début de ma fonction :

DECLARE
     ldatfrom TIMESTAMP := $3;
     ldatto TIMESTAMP := $4;

.. et d'utiliser ldatfrom et ldatto dans le WHERE du PREPARE... négatif.

Quelqu'un a une idée?

Finalement, voici le code complet de ma fonction:

CREATE OR REPLACE FUNCTION stirq.qrycastempscoutstyperpt(
pvintregionid INT, 
pvstrregionnom VARCHAR, 
pvdatfrom timestamp without time zone, 
pvdatto timestamp without time zone, 
pvstrlangue VARCHAR)

  RETURNS TABLE(intcasid integer, strnodossier character varying, strconseillernom character varying, intlocalisationid integer, strlocalisationnom character varying, intregionid integer, strregionnom character varying, stractivitenom character varying, inttemps integer, intcouts integer, strdossieretatnom character varying) AS
$BODY$

/*
DECLARE
	ldatfrom TIMESTAMP := $3;
	ldatto TIMESTAMP := $4;
*/

BEGIN

	PREPARE tmpCas(integer, character varying, character varying, integer, character varying, integer, character varying, character varying, integer, integer, character varying) AS

	SELECT Cas.intCasId AS intCasIdGlobal,
		Cas.strNoDossier,
		Users.strUserFirstName || ' ' || Users.strUserLastName AS strConseillerNom,
		Localisation.intLocalisationId,

		CASE $5
			WHEN 'fr' THEN Localisation.strLocalisationNomFr
			WHEN 'en' THEN Localisation.strLocalisationNomEn
		END AS strLocalisationNom,

		Region.intRegionId,
		CASE $5
			WHEN 'fr' THEN Region.strRegionNomFr
			WHEN 'en' THEN Region.strRegionNomEn
		END AS strRegionNom,

		CASE $5
			WHEN 'fr' THEN ActiviteNom.strActiviteNomFr
			WHEN 'en' THEN ActiviteNom.strActiviteNomEn
		END AS strActiviteNom,

		Cheminement.intTemps,
		Cheminement.intCouts,
		CASE $5
			WHEN 'fr' THEN DossierEtat.strDossierEtatAbrFr
			WHEN 'en' THEN DossierEtat.strDossierEtatAbrEn 
		END AS strDossierEtatNom

		FROM stirq.Cas

		INNER JOIN stirq.DossierEtat ON
		stirq.Cas.intDossierEtatId = stirq.DossierEtat.intDossierEtatId

		INNER JOIN stirq.Localisation ON
		stirq.Cas.intLocalisationId = stirq.Localisation.intLocalisationId

		INNER JOIN stirq.Region ON
		stirq.Localisation.intRegionId = stirq.Region.intRegionId

		INNER JOIN stirq.Intervention ON
		stirq.Cas.intCasId = stirq.Intervention.intCasId

		INNER JOIN stirq.ActiviteNom ON
		stirq.Intervention.intActiviteNomId = stirq.ActiviteNom.intActiviteNomId

		INNER JOIN stirq.Cheminement ON
		stirq.Intervention.intInterventionId = stirq.Cheminement.intInterventionId
		
		INNER JOIN 

			(SELECT	stirq.Cas.intCasId,
			MAX(intCheminementId) AS intLastCheminementId

			FROM stirq.Cheminement 

			INNER JOIN stirq.Intervention ON
			stirq.Cheminement.intInterventionId = stirq.Intervention.intInterventionId

			INNER JOIN stirq.Cas ON
			stirq.Intervention.intCasId = stirq.Cas.intCasId
					
			INNER JOIN stirq.Localisation ON
			stirq.Cas.intLocalisationId = stirq.Localisation.intLocalisationId

			INNER JOIN stirq.Region ON
			stirq.Localisation.intRegionId = stirq.Region.intRegionId
					
			WHERE 
				stirq.Cheminement.datCheminement BETWEEN $3 AND $4 AND
				Region.intRegionId = $1

			GROUP BY Cas.intCasId
			) AS vwsLastCheminementCas ON 
		
			Cas.intCasId = vwsLastCheminementCas.intCasId
			
		INNER JOIN (
			SELECT	Cheminement.intCheminementId,
					Cheminement.intConseiller1Id
					
			FROM	stirq.Cheminement
			
			INNER JOIN stirq.Intervention ON
			stirq.Cheminement.intInterventionId = stirq.Intervention.intInterventionId

			INNER JOIN stirq.Cas ON
			stirq.Intervention.intCasId = stirq.Cas.intCasId
					
			INNER JOIN stirq.Localisation ON
			stirq.Cas.intLocalisationId = stirq.Localisation.intLocalisationId

			INNER JOIN stirq.Region ON
			stirq.Localisation.intRegionId = stirq.Region.intRegionId
			
			WHERE 
				stirq.Cheminement.datCheminement BETWEEN $3 AND $4 AND
				stirq.Region.intRegionId = $1
		
		) AS vwsLastConseillerCas ON
		vwsLastCheminementCas.intLastCheminementId = vwsLastConseillerCas.intCheminementId
		
		INNER JOIN stirq.Users ON
		vwsLastConseillerCas.intConseiller1Id = stirq.Users.intUserId

		WHERE 
			Cheminement.datCheminement BETWEEN $3 AND $4 AND
			Region.intRegionId = $1

		ORDER BY Cas.strNoDossier, ActiviteNom.intOrder;

	CREATE TEMP TABLE tmpCas AS EXECUTE tmpCas;
	
	INSERT INTO tmpCas
	SELECT	0,
		NULL,
		NULL,
		0,
		NULL,
		$1,
		$2::VARCHAR,
		CASE $5
			WHEN 'fr' THEN stirq.ActiviteNom.strActiviteNomFr
			WHEN 'en' THEN stirq.ActiviteNom.strActiviteNomEn
		END AS strActiviteNom,
		NULL,
		NULL,
		NULL
	
	FROM	stirq.ActiviteNom
	WHERE	intActiviteTypeId = 4;
   
	RETURN QUERY SELECT * FROM tmpCas;

	DEALLOCATE tmpCas;

END;
	
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION stirq.qrycastempscoutstyperpt(integer, character varying, timestamp without time zone, timestamp without time zone, character varying) OWNER TO cxm526;

Merci !

#28 Re : Général » Table temporaire dans une fonction » 18/08/2011 16:51:39

Encore une fois j'avais lu trop vite! wink

Discussion close!

#29 Re : Général » Table temporaire dans une fonction » 18/08/2011 16:49:10

dverite a écrit :

Ah! C'est pas LANGUAGE sql qu'il faut pour la fonction , c'est plpgsql.

Exactement!! J'ai changé le language et ajouté les BEGIN et END; et tout fonctionne à merveille...

Désolé les gars, c'était mon erreur.

Merci beaucoup pour votre support. C'est grandement apprécié.

#30 Re : Général » Table temporaire dans une fonction » 18/08/2011 16:47:12

gleu a écrit :

Pas bizarre du tout. La table temporaire existe tout le temps de la session (donc tant qu'il n'y a pas déconnexion de l'éditeur de requête dans votre cas).

Je comprend, mais je ne me suis pas déconnecté?! Normalement elle aurait dûe exister encore puisque je n'ai pas fermer l'éditeur de requête, non? Le message que j'ai est comme si la table n'existait pas, alors qu'elle devrait logiquement exister encore si on prend en considération vos explications antérieures.

Merci beaucoup

#31 Re : Général » Table temporaire dans une fonction » 18/08/2011 16:45:01

Voici la fonction au complet :

CREATE OR REPLACE FUNCTION stirq.qryCasTempsCoutsTypeRpt(
	pvintRegionId INT,
	pvstrRegionNom VARCHAR(100),
	pvdatFrom TIMESTAMP,
	pvdatTo TIMESTAMP,
	pvstrLangue VARCHAR(10)
)

RETURNS TABLE(
	intCasId INT,
	strNoDossier VARCHAR(50),
	strConseillerNom VARCHAR(255),
	intLocalisationId INT,
	strLocalisationNom VARCHAR(255),
	intRegionId INT,
	strRegionNom VARCHAR(255),
	strActiviteNom VARCHAR(100),
	intTemps INT,
	intCouts INT,
	strDossierEtatNom VARCHAR(255)
  ) AS
  
$BODY$

	PREPARE t_cas AS
		SELECT Cas.intCasId AS intCasIdGlobal,
		Cas.strNoDossier,
		Users.strUserFirstName || ' ' || Users.strUserLastName AS strConseillerNom,
		Localisation.intLocalisationId,

		CASE $5
			WHEN 'fr' THEN Localisation.strLocalisationNomFr
			WHEN 'en' THEN Localisation.strLocalisationNomEn
		END AS strLocalisationNom,

		Region.intRegionId,
		CASE $5
			WHEN 'fr' THEN Region.strRegionNomFr
			WHEN 'en' THEN Region.strRegionNomEn
		END AS strRegionNom,

		CASE $5
			WHEN 'fr' THEN ActiviteNom.strActiviteNomFr
			WHEN 'en' THEN ActiviteNom.strActiviteNomEn
		END AS strActiviteNom,

		Cheminement.intTemps,
		Cheminement.intCouts,
		CASE $5
			WHEN 'fr' THEN DossierEtat.strDossierEtatAbrFr
			WHEN 'en' THEN DossierEtat.strDossierEtatAbrEn 
		END AS strDossierEtatNom

		FROM stirq.Cas

		INNER JOIN stirq.DossierEtat ON
		stirq.Cas.intDossierEtatId = stirq.DossierEtat.intDossierEtatId

		INNER JOIN stirq.Localisation ON
		stirq.Cas.intLocalisationId = stirq.Localisation.intLocalisationId

		INNER JOIN stirq.Region ON
		stirq.Localisation.intRegionId = stirq.Region.intRegionId

		INNER JOIN stirq.Intervention ON
		stirq.Cas.intCasId = stirq.Intervention.intCasId

		INNER JOIN stirq.ActiviteNom ON
		stirq.Intervention.intActiviteNomId = stirq.ActiviteNom.intActiviteNomId

		INNER JOIN stirq.Cheminement ON
		stirq.Intervention.intInterventionId = stirq.Cheminement.intInterventionId
		
		INNER JOIN 

			(SELECT	stirq.Cas.intCasId,
			MAX(intCheminementId) AS intLastCheminementId

			FROM stirq.Cheminement 

			INNER JOIN stirq.Intervention ON
			stirq.Cheminement.intInterventionId = stirq.Intervention.intInterventionId

			INNER JOIN stirq.Cas ON
			stirq.Intervention.intCasId = stirq.Cas.intCasId
					
			INNER JOIN stirq.Localisation ON
			stirq.Cas.intLocalisationId = stirq.Localisation.intLocalisationId

			INNER JOIN stirq.Region ON
			stirq.Localisation.intRegionId = stirq.Region.intRegionId
					
			WHERE 
				stirq.Cheminement.datCheminement BETWEEN $3 AND $4 AND
				Region.intRegionId = $1

			GROUP BY Cas.intCasId
			) AS vwsLastCheminementCas ON 
		
			Cas.intCasId = vwsLastCheminementCas.intCasId
			
		INNER JOIN (
			SELECT	Cheminement.intCheminementId,
					Cheminement.intConseiller1Id
					
			FROM	stirq.Cheminement
			
			INNER JOIN stirq.Intervention ON
			stirq.Cheminement.intInterventionId = stirq.Intervention.intInterventionId

			INNER JOIN stirq.Cas ON
			stirq.Intervention.intCasId = stirq.Cas.intCasId
					
			INNER JOIN stirq.Localisation ON
			stirq.Cas.intLocalisationId = stirq.Localisation.intLocalisationId

			INNER JOIN stirq.Region ON
			stirq.Localisation.intRegionId = stirq.Region.intRegionId
			
			WHERE 
				stirq.Cheminement.datCheminement BETWEEN $3 AND $4 AND
				stirq.Region.intRegionId = $1
		
		) AS vwsLastConseillerCas ON
		vwsLastCheminementCas.intLastCheminementId = vwsLastConseillerCas.intCheminementId
		
		INNER JOIN stirq.Users ON
		vwsLastConseillerCas.intConseiller1Id = stirq.Users.intUserId

		WHERE 
			Cheminement.datCheminement BETWEEN $3 AND $4 AND
			Region.intRegionId = $1

		ORDER BY Cas.strNoDossier, ActiviteNom.intOrder;

	CREATE TEMP TABLE t_cas AS EXECUTE t_cas;
	
	INSERT INTO t_cas
	SELECT	0,
		NULL,
		NULL,
		0,
		NULL,
		$1,
		$2,
		CASE $5
			WHEN 'fr' THEN stirq.ActiviteNom.strActiviteNomFr
			WHEN 'en' THEN stirq.ActiviteNom.strActiviteNomEn
		END AS strActiviteNom,
		NULL,
		NULL,
		NULL
	
	FROM	stirq.ActiviteNom
	WHERE	intActiviteTypeId = 4;
   
	SELECT * FROM t_cas;
	
$BODY$

  LANGUAGE sql VOLATILE
  COST 100;

Message d'erreur :
ERROR:  relation "t_cas" does not exist
LINE 140:  INSERT INTO t_cas
                       ^


********** Error **********

ERROR: relation "t_cas" does not exist
SQL state: 42P01
Character: 3683

#32 Re : Général » Table temporaire dans une fonction » 18/08/2011 16:43:34

Je pense que j'ai mis le doigt sur le problème, mais je ne comprend pas pourquoi PostgreSQL agit ainsi.

J'ai testé le code suivant dans pgAdmin :

CREATE TEMP TABLE temptest(col INTEGER);

INSERT INTO temptest VALUES (1);
INSERT INTO temptest VALUES (2);
INSERT INTO temptest VALUES (3);

SELECT * FROM temptest;

En appuyant sur Execute Query, je vois le résultat de la requête, donc :
1
2
3

Si je réappuie sur Execute Query, j'ai le message suivant comme mon problème initial:
ERROR:  relation "temptest" already exists


********** Error **********

ERROR: relation "temptest" already exists
SQL state: 42P07



Vraiment bizzare... quelqu'un a une idée??

#33 Re : Général » Table temporaire dans une fonction » 18/08/2011 16:06:12

La fonction n'est même pas encore créée, je ne réussi pas à la faire compiler.

Voici le code d'entête de ma fonction :

CREATE OR REPLACE FUNCTION stirq.qryCasTempsCoutsTypeRpt(
	pvintRegionId INT,
	pvstrRegionNom VARCHAR(100),
	pvdatFrom TIMESTAMP,
	pvdatTo TIMESTAMP,
	pvstrLangue VARCHAR(10)
)

RETURNS TABLE(
	intCasId INT,
	strNoDossier VARCHAR(50),
	strConseillerNom VARCHAR(255),
	intLocalisationId INT,
	strLocalisationNom VARCHAR(255),
	intRegionId INT,
	strRegionNom VARCHAR(255),
	strActiviteNom VARCHAR(100),
	intTemps INT,
	intCouts INT,
	strDossierEtatNom VARCHAR(255)
  ) AS
  
$BODY$

[...]

Je n'ai qu'un seul schéma dans cette base de données, et il est nommé "stirq". J'ai supprimé le schéma public.

Si je roule SHOW search_path, j'ai le résultat ""$user",public"

Merci

#34 Re : Général » Table temporaire dans une fonction » 18/08/2011 14:18:38

J'ai enlevé le point virgule et c'est la même chose.

Est-ce que ça pourrait avoir un lien avec mon schéma?

J'ai toutefois tenté de spécifier stirq. avant t_cas et j'ai le même problème..

#35 Re : Général » Table temporaire dans une fonction » 18/08/2011 14:01:14

Ce serait effectivement très logique! Par contre, j'avais essayé d'enlever ON COMMIT DROP et de faire le drop moi-même à la fin de la fonction... même résultat.

L'instruction CREATE était ainsi :
CREATE TEMP TABLE t_cas WITH (OIDS) AS
EXECUTE t_cas;

.. suivi de l'instruction INSERT

#36 Re : Général » Table temporaire dans une fonction » 18/08/2011 13:54:04

J'ai ajouté le détail de mon INSERT dans le post #4.

#37 Re : Général » Table temporaire dans une fonction » 18/08/2011 13:51:16

Non, la seule erreur que le compilateur me donne est le t_cas does not exist.

En fait, l'instruction INSERT suit immédiatement le EXECUTE. Les [...] sont inutiles... désolé

#38 Re : Général » Table temporaire dans une fonction » 17/08/2011 19:21:43

Voici le code de la fonction:

PREPARE t_cas AS
		SELECT Cas.intCasId,
		Cas.strNoDossier,
		Users.strUserFirstName || ' ' || Users.strUserLastName AS strConseillerNom,
		Localisation.intLocalisationId,

		CASE $5
			WHEN 'fr' THEN Localisation.strLocalisationNomFr
			WHEN 'en' THEN Localisation.strLocalisationNomEn
		END AS strLocalisationNom,

		Region.intRegionId,
		CASE $5
			WHEN 'fr' THEN Region.strRegionNomFr
			WHEN 'en' THEN Region.strRegionNomEn
		END AS strRegionNom,

		CASE $5
			WHEN 'fr' THEN ActiviteNom.strActiviteNomFr
			WHEN 'en' THEN ActiviteNom.strActiviteNomEn
		END AS strActiviteNom,

		Cheminement.intTemps,
		Cheminement.intCouts,
		CASE $5
			WHEN 'fr' THEN DossierEtat.strDossierEtatAbrFr
			WHEN 'en' THEN DossierEtat.strDossierEtatAbrEn 
		END AS strDossierEtatNom

		FROM stirq.Cas

		INNER JOIN stirq.DossierEtat ON
		stirq.Cas.intDossierEtatId = stirq.DossierEtat.intDossierEtatId

		INNER JOIN stirq.Localisation ON
		stirq.Cas.intLocalisationId = stirq.Localisation.intLocalisationId

		INNER JOIN stirq.Region ON
		stirq.Localisation.intRegionId = stirq.Region.intRegionId

		INNER JOIN stirq.Intervention ON
		stirq.Cas.intCasId = stirq.Intervention.intCasId

		INNER JOIN stirq.ActiviteNom ON
		stirq.Intervention.intActiviteNomId = stirq.ActiviteNom.intActiviteNomId

		INNER JOIN stirq.Cheminement ON
		stirq.Intervention.intInterventionId = stirq.Cheminement.intInterventionId
			
		WHERE 
		Cheminement.datCheminement BETWEEN $3 AND $4 AND
		Region.intRegionId = $1

		ORDER BY Cas.strNoDossier, ActiviteNom.intOrder;

	CREATE TEMP TABLE t_cas WITH (OIDS) ON COMMIT DROP AS
	EXECUTE t_cas;

	INSERT INTO t_cas
	SELECT	0,
		NULL,
		NULL,
		0,
		NULL,
		$1,
		$2,
		CASE $5
			WHEN 'fr' THEN stirq.ActiviteNom.strActiviteNomFr
			WHEN 'en' THEN stirq.ActiviteNom.strActiviteNomEn
		END AS strActiviteNom,
		NULL,
		NULL,
		NULL
	
	FROM	stirq.ActiviteNom
	WHERE	intActiviteTypeId = 4;
                 
	SELECT * FROM t_cas;

J'ai le message suivant :
ERROR:  relation "t_cas" does not exist
LINE 156:  INSERT INTO t_cas(intCasId, strNoDossier, strConseillerNom,...

J'ai suivi les instructions à la page 917 dans le manuel de PostgreSQL 9.0.3 (CREATE TABLE AS)

Merci!

#39 Re : Général » Table temporaire dans une fonction » 17/08/2011 18:51:18

D'accord. J'ai fait plusieurs tests ce matin avec cette commande mais lorsque j'arrivais au INSERT, PostgreSQL me disait que le nom de ma table temporaire n'existait pas (relation does not exist).

Faut-il mettre un prefix comme $ pour les paramètres?

Merci !

#40 Général » Table temporaire dans une fonction » 17/08/2011 18:44:57

charleydc5
Réponses : 25

Bonjour à tous,

Dans certaines requêtes MSSQL, nous avons utilisé des tables temporaires pour faire des traitements spécifiques. Par exemple :

DECLARE @Cas TABLE
	(intCasId INT,
	strNoDossier VARCHAR(50),
	strConseillerNom VARCHAR(255),
	intLocalisationId INT,
	strLocalisationNom VARCHAR(255),
	intRegionId INT,
	strRegionNom VARCHAR(255),
	strActiviteNom VARCHAR(100),
	intTemps INT,
	intCouts INT,
	strDossierEtatNom VARCHAR(255)
	)
	
	INSERT INTO @Cas(intCasId, strNoDossier, strConseillerNom, intLocalisationId, strLocalisationNom, intRegionId, strRegionNom, strActiviteNom, intTemps, intCouts, strDossierEtatNom)
[...] une requête SELECT qui alimente l'instruction INSERT ci-dessus
Plusieurs autres traitements suivent, et à la fin je fais SELECT * FROM @Cas, et c'est le "resultset" qui est envoyé à mon rapport (JasperSoft iReport).

J'aimerais reproduire la même chose en PostgreSQL. J'ai lu sur les tables temporaires, mais j'aimerais savoir si c'est possible de déclarer une table "virtuelle" pour l'exécution de la fonction seulement?

Merci beaucoup

#41 Re : Général » Schéma par défaut » 17/08/2011 17:02:15

Super! Toujours aussi précis dans vos instructions.

Merci beaucoup gleu

#42 Général » Schéma par défaut » 17/08/2011 16:08:16

charleydc5
Réponses : 2

Bonjour à tous,

Je suis présentement en train de réécrire une multitude de procédures stockées et fonctions MSSQL et DB2 vers PostgreSQL, et je rencontre un irritant à propos duquel j'aurais une question.

Est-il possible de définir un schéma par défaut pour une fonction?

Dans notre équipe, le schéma se nomme toujours "stirq", donc j'aimerais être en mesure de ne pas toujours devoir spécifier stirq.MA_TABLE dans toutes mes requêtes... J'ai des fonctions qui ont plus de 1000 lignes donc il est très embarassant de devoir faire plusieurs "replace all" pour mettre "stirq." devant chaque table.

Merci beaucoup pour votre aide habituelle

#43 Re : Migration » Problème d'importation des caractères spéciaux dans PostgreSQL 9.0.3 » 15/07/2011 16:51:19

Exactement. Je suis allé voir dans mes configurations Windows XP et j'avais Français (Belgique) alors que je suis au Canada. Ceci devait être une erreur.

Par contre, après un redémarrage de mon laptop pour être en Français (Canada), le problème est toujours le même.

J'ai donc décidé d'installer l'outil de conversion sur le serveur Windows 2008 Server de PostgreSQL qui lui est en English (Canada). Devinez-quoi, les accents et les autres caractères spéciaux ont suivi parfaitement.

Je n'y comprend plus rien... Pourtant, dans ma tête, l'anglais n'aime pas les accents, alors que le Français en utilise très fréquemment.

Quelqu'un a une idée ou des hypothèses?

Merci

#44 Re : Migration » Problème d'importation des caractères spéciaux dans PostgreSQL 9.0.3 » 15/07/2011 13:20:44

Une chose que j'aimerais savoir est comment faire pour ajouter des collations et character set supplémentaires à PostgreSQL?

Présentement, j'ai seulement C, English_Canada.1252 et POSIX.

J'aimerais pourvoir y retrouver en_CA.UTF-8

Merci beaucoup

#45 Re : Migration » Problème d'importation des caractères spéciaux dans PostgreSQL 9.0.3 » 15/07/2011 13:11:34

Donc, si j'ai bien compris, il faudrait que mon pgAdmin (client_encoding) et que mon server_encoding (PostgreSQL) aient le même encoding pour éviter tout problème de ce genre.

Présentement, j'ai UNICODE comme client_encoding et UTF8 comme server_encoding.

J'ai écris au fabricant du logiciel. Je vous tiens au courant des développements.

#46 Re : Migration » Problème d'importation des caractères spéciaux dans PostgreSQL 9.0.3 » 14/07/2011 19:04:43

ESF Database Migration Toolkit

J'ai pourtant sélectionné UTF-8, j'ai également essayé SQL_ASCII et WIN.1252

Toujours la même chose.

#47 Re : Migration » Problème d'importation des caractères spéciaux dans PostgreSQL 9.0.3 » 14/07/2011 18:52:35

Affiché par pgAdmin quand je vais dans "View Data".

Lorsque je vais en console, même le contenu de \? est incorrect.
Exemple :
exÚcute SQL COPY avec le flux de donnÚes dirigÚ vers l'h¶te client

#48 Re : Migration » Problème d'importation des caractères spéciaux dans PostgreSQL 9.0.3 » 14/07/2011 18:39:14

J'ai remarqué que dans postgresql.conf, ma configuration de base pour les lc_ est la suivante :
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'English_Canada.1252'            # locale for system error message
                    # strings
lc_monetary = 'English_Canada.1252'            # locale for monetary formatting
lc_numeric = 'English_Canada.1252'            # locale for number formatting
lc_time = 'English_Canada.1252'                # locale for time formatting

J'aimerais la changer pour en_CA.UTF-8 mais je n'y arrive pas. Lorsque je tente de redémarrer le service, ce dernier échoue et ne démarre pas.

Merci!

#49 Re : Migration » Problème d'importation des caractères spéciaux dans PostgreSQL 9.0.3 » 14/07/2011 18:37:55

Bonjour gleu,

la commande SHOW client_encoding; retourne UNICODE.

J'utilse pgAdminIII version 1.12.2

Merci!

#50 Migration » Problème d'importation des caractères spéciaux dans PostgreSQL 9.0.3 » 14/07/2011 15:43:07

charleydc5
Réponses : 13

Bonjour à tous,

Je suis présentement en train de convertir des bases de données de MS SQL 2008 vers PostgreSQL, et je rencontre un problème en ce qui concerne l'importation des caractères spéciaux auquel j'ai de la difficulté à résoudre.

MS SQL Server 2008
Collation : SQL_Latin1_General_CP0850_CI_AI

PostgreSQL 9.0.3
Lorsque je créé ma base de données vide pour ensuite transférer mes données, elle a les paramètres suivants :
CREATE DATABASE maBase
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'English_Canada.1252'
LC_CTYPE = 'English_Canada.1252'
CONNECTION LIMIT = -1;

J'ai également testé avec la configuration ci-dessous:
CREATE DATABASE maBase
WITH OWNER = postgres
ENCODING = 'WIN1252'
TABLESPACE = pg_default
LC_COLLATE = 'English_Canada.1252'
LC_CTYPE = 'English_Canada.1252'
CONNECTION LIMIT = -1;

Dans la liste de collations, je n'ai 'English_Canada.1252', 'C' et 'POSIX'

Dans tous les cas, j'ai des résultats comme celui-ci dans ma base PostgreSQL :
- "GÚrer les conflits en milieu de travail"
- "ActivitÚs de consolidation d'Úquipe"
- etc.

Avez-vous une idée de solution pour ce problème?

Merci beaucoup!

Pied de page des forums

Propulsé par FluxBB