Cast produit Renvoyé le type character varying ne correspond pas attendu de type character varying(8)'
Hier, nous avons eu une base de données PostgreSQL mis à niveau vers la version 9.1.3. Nous pensions avoir tout testé et prêt, mais il y a une fonction que nous avons manqué. Elle retourne un tableau de type comme ceci:
CREATE OR REPLACE FUNCTION myfunc( patient_number varchar
, tumor_number_param varchar, facility_number varchar)
RETURNS SETOF patient_for_registrar
LANGUAGE plpgsql
AS
$body$
BEGIN
RETURN QUERY
SELECT cast(nfa.patient_id_number as varchar),
...
Je ne ne donne que la première colonne de la sélection parce que c'est là l'erreur se produit. Avant aujourd'hui, cette fonction marchait bien, mais maintenant il donne cette erreur:
ERREUR: structure de la requête ne correspond pas à la fonction de type de résultat
Détail: Retour de type character varying ne correspondent pas du type attendu
character varying(8) dans la colonne 1. Où: fonctions PL/pgSQL
"getwebregistrarpatient_withdeletes" de la ligne 3 à la REQUÊTE de RETOUR [SQL
Etat=42804]
La colonne nfa.patient_id_number
est du texte et de l'est de voter pour la colonne patient_id_number
dans patient_for_registrar
qui est varchar(8)
. Après avoir lu cela, je pense que le problème est dû à la longueur de la colonne n'est pas spécifié lors de la conversion de texte. Mais le problème c'est que j'ai essayé différentes combinaisons de sous-chaînes pour résoudre ce problème et aucun n'est de résoudre le problème:
substring(cast(nfa.patient_id_number as varchar) from 1 for 8),
cast(substring(nfa.patient_id_number from 1 for 8) as varchar),
cast(substring(nfa.patient_id_number from 1 for 8) as varchar(8)),
Quelqu'un aurait-il les pointeurs?
OriginalL'auteur hermes the goat | 2012-05-25
Vous devez vous connecter pour publier un commentaire.
Votre fonction ..
La ligne renvoyée type doit correspondre au type déclaré exactement. Vous n'avez pas divulguer la définition de
patient_for_registrar
, probablement associés type composite d'une table. Je cite le manuel à propos de Déclaration de Types de composé:Si la première colonne de ce type (tableau) est défini
varchar(8)
(avec modificateur de longueur) - que le message d'erreur indique, vous devez retournervarchar(8)
avec le même modificateur de longueur;varchar
va pas le faire. Il n'est pas pertinent pour la question de savoir si la longueur de la chaîne est seulement de 8 caractères, le type de données doit correspondre.varchar
,varchar(n)
etvarchar(m)
sont différents types de données pour PostgreSQL.Les anciennes versions ne pas appliquer les modificateurs de type, mais avec PostgreSQL 9.0 ce qui a changé pour plpgsql:
Deux façons de base pour résoudre votre problème:
Vous pouvez convertir les valeurs renvoyées pour correspondre à la définition de
patient_for_registrar
:Ou vous pouvez modifier la
RETURNS
clause. Je voudrais utiliserRETOURNE la TABLE
et de déclarer une correspondance de type composite. Voici un exemple.En aparté: je jamais utilisation
varchar
si je peux l'éviter - et surtout pas avec modificateur de longueur. Il offre à peu près rien que le typetext
ne pouvais pas le faire. Si je besoin une limitation de la longueur, j'utilise une colonne de la contrainte qui peut être modifié sans avoir à réécrire l'ensemble de la table.Dans PostgreSQL, le système crée un type composite (type de ligne) du même nom chaque fois que vous créez une table. J'ai modifié ma réponse avec plus d'informations et de clarifier un peu.
C'est tous super info, je suis en changeant à la table type de retour et il fonctionne comme un charme. Merci beaucoup pour votre aide.
OriginalL'auteur Erwin Brandstetter