2016-04-22 7 views
3

Ich erhalte diesen Fehlerkann keine Daten Art der Ansicht Spalte SQL ändern

cannot change data type of view column "percent" from integer to double precision

Ich habe eine Funktion findIntl() genannt, die

create or replace function findIntl(integer) returns float as $$ 
    select cast(count(*) as float) 
    from students s 
    join program_enrolments pe on (s.id = pe.student) 
    where s.stype = 'intl' and pe.semester = $1; 
$$ language sql; 

einen Schwimmer zurück und ich verwende den Rückgabewert in einer Ansicht genannt findPercent

create or replace view findPercent(semester, percent) as 
    select q6(s.id), findIntl(s.id) 
    from semesters s 
    where s.id = id and s.term ~ 'S' and s.year >= 2004; 

Wenn ich ersetzen findIntl() mit einer anderen Spalte Werte funktioniert es völlig in Ordnung, aber wenn findIntl() es sagt, es ist cannot change data type of view column "percent" from integer to double precision

Wenn ich cast(findIntl(s.id) as numeric(4,2) es sagt

ERROR: cannot change data type of view column "percent" from integer to numeric(4,2)

ich auf Stackoverflow, über etwas zu lesen haben mit dropping Tabellen zu tun, aber ich verstehe nicht ganz, warum ich Ich muss das tun, und ich bin mir nicht einmal sicher, ob es für diesen Fall gilt.

Auch, wenn ich entferne Semester von findPercent und nur Prozent dort halten und select findIntl(s.id) nur dann sagt es

ERROR: cannot drop columns from view

Ich bin neu, so leid für meine Unwissenheit SQL, aber wenn ich eine Spalte mit ganzen Zahlen es funktioniert einwandfrei, aber wenn ich eine Funktion verwende, um Werte zurückzugeben, warum bricht das ab und wie kann ich das beheben?

+0

Markieren Sie die verwendeten dbms. (Produktspezifische Frage.) – jarlh

+0

SQL ist eine Sprache, die von ANSI/ISO spezifiziert wird. Es gibt verschiedene Produkte, die die SQL-Sprache mehr oder weniger gemäß der ANSI-Spezifikation implementieren. Es scheint jedoch, dass Sie hier ein produktspezifisches Problem haben. – jarlh

+0

@jarlh Ah yep, ich benutze postgres glaube ich –

Antwort

0

Ansichten sind Aliase zu Querys. Wenn Sie sie löschen, wirkt sich dies nicht auf Ihre Daten aus. Um zu arbeiten, müssen Sie sie löschen und neu erstellen, wenn Sie den Spaltentyp in Sichten auf Postgres ändern.

drop view findPercent; 

ändern da findIntl Funktion und dann

create or replace view findPercent(semester, percent) as 
select q6(s.id), findIntl(s.id) 
from semesters s 
where s.id = id and s.term ~ 'S' and s.year >= 2004; 
2

Ich denke, die Postgres documentation ist ziemlich klar für Ansichten über die Verwendung ersetzen:

CREATE OR REPLACE VIEW is similar, but if a view of the same name already exists, it is replaced. The new query must generate the same columns that were generated by the existing view query (that is, the same column names in the same order and with the same data types), but it may add additional columns to the end of the list. The calculations giving rise to the output columns may be completely different.

Sie müssen die Ansicht fallen zu lassen und Erstelle es neu.

Verwandte Themen