7 Stimmen

Cast erzeugt 'Zurückgegebener Typ Zeichen variierend stimmt nicht mit erwartetem Typ Zeichen variierend(8) überein'.

Gestern haben wir eine PostgreSQL-Datenbank auf die Version 9.1.3 aktualisiert. Wir dachten, wir hätten alles getestet und fertig, aber es gibt eine Funktion, die wir übersehen haben. Sie gibt einen Tabellentyp wie diesen zurück:

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

Ich gebe nur die erste Spalte des Selects an, weil dort der Fehler auftritt. Vor heute lief diese Funktion gut, aber jetzt gibt es diesen Fehler:

ERROR: Struktur der Abfrage entspricht nicht dem Ergebnistyp der Funktion
Einzelheiten: Zurückgegebener Typ character varying stimmt nicht mit dem erwarteten Typ überein Zeichen variierend(8) in Spalte 1. Wo: PL/pgSQL-Funktion "getwebregistrarpatient_withdeletes" Zeile 3 bei RETURN QUERY [SQL State=42804]

Die Spalte nfa.patient_id_number ist Text und wird für die Spalte patient_id_number en patient_for_registrar das ist varchar(8) . Nach dem Lesen über diese einige Ich denke, das Problem ist, weil die Spaltenlänge nicht angegeben wird, wenn Casting von Text. Aber das Problem ist, ich habe versucht, verschiedene Kombinationen von Teilzeichenfolgen, um dies zu beheben und keine sind das Problem zu lösen:

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

Hat jemand einen Tipp für Sie?

17voto

Erwin Brandstetter Punkte 530399

Ihre Funktion ..

RETURNS SETOF patient_for_registrar

Der zurückgegebene Zeilentyp muss genau mit dem deklarierten Typ übereinstimmen. Sie haben nicht die Definition von patient_for_registrar wahrscheinlich der zugehörige zusammengesetzte Typ einer Tabelle. Ich zitiere das Handbuch über Deklaration von zusammengesetzten Typen :

Wann immer Sie eine Tabelle erstellen, ist ein zusammengesetzter Typ ein mit demselben Namen wie die Tabelle erstellt, um den Zeilentyp der Tabelle zu Typs darstellt.

Wenn die erste Spalte dieses Typs (Tabelle) definiert ist varchar(8) (mit Längenmodifikator) - wie die Fehlermeldung angibt, müssen Sie varchar(8) mit dem gleichen Längenmodifikator; varchar nicht ausreichen wird. Dabei ist es unerheblich, ob die Zeichenfolge nur 8 Zeichen lang ist, die Datentyp muss übereinstimmen.

varchar , varchar(n) y varchar(m) sind verschiedene Datentypen für PostgreSQL.

Ältere Versionen haben die Typmodifikatoren nicht erzwungen, aber mit PostgreSQL 9.0 dies wurde für plpgsql geändert :

PL/pgSQL erfordert jetzt Spalten von zusammengesetzten r erwarteten Typmodifikator sowie dem Basistyp entsprechen (Pavel Stehule, Tom Lane)

Wenn zum Beispiel eine Spalte des Ergebnistyps deklariert wird als NUMERIC(30,2) deklariert ist, ist es nicht mehr akzeptabel, eine NUMERIC mit einer anderer Genauigkeit in dieser Spalte zurückzugeben. Frühere Versionen vernachlässigten die Überprüfung den Typmodifikator zu überprüfen und erlaubten daher Ergebniszeilen, die nicht die nicht mit den deklarierten Einschränkungen übereinstimmen.

Es gibt zwei grundlegende Möglichkeiten, Ihr Problem zu lösen:

  • Sie können die zurückgegebenen Werte so umwandeln, dass sie mit der Definition von patient_for_registrar :

    nfa.patient_id_number::varchar(8)
  • Oder Sie können die RETURNS Klausel. Ich würde verwenden RETURNS TABLE und deklarieren Sie einen passenden zusammengesetzten Typ. Hier ist ein Beispiel .

    RETURNS TABLE (patient_for_registrar varchar, col2 some_type, ...)

Nebenbei bemerkt: Ich niemals verwenden. varchar wenn ich es vermeiden kann - vor allem nicht mit Längenmodifikator. Er bietet kaum etwas, was der Typ text nicht tun konnte. Wenn ich besoin eine Längenbeschränkung, verwende ich eine Spaltenbeschränkung, die geändert werden kann, ohne die gesamte Tabelle neu zu schreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X