2017-05-10 1 views
1

In postgreSQL habe ich erfolgreich eine Funktion erstellt, die einen Refcursor zurückgibt, wobei in einem zweiten Schritt alle Zeilen abgerufen werden können.Ansicht erstellen, indem alle Zeilen abgerufen werden (Aufruf einer Funktion, die einen Cursor zurückgibt)

Ich möchte eine Sicht mit den Datensätzen erstellen, die von der Funktion zurückgegeben werden, aber ich kann nicht herausfinden, wie dies (wenn überhaupt) erreicht werden konnte, da die SELECT Anweisung nur den Cursor, aber nicht die Datensätze zurückgibt. Diese müssen mit FETCH ALL FROM abgerufen werden.

Dies ist die Funktion (es ist im Grunde eine Modifikation von dem, was in this blog post erklärt):

CREATE OR REPLACE FUNCTION do_cross_cursor() 
RETURNS refcursor AS $$ 
DECLARE 
col_list text[] := '{}'; 
query text; 
r RECORD; 
result refcursor := 'result'; 
BEGIN 
FOR r IN EXECUTE 'SELECT DISTINCT jahrmonat::text FROM susa2' 
LOOP 
col_list := array_append(col_list, 'SUM(CASE jahrmonat WHEN' 
|| quote_literal(r.jahrmonat) || ' THEN wert_monat_kum' 
|| ' ELSE 0 END) AS ' || quote_ident(r.jahrmonat) || ''); 
END LOOP; 
query := 'SELECT pk, ' 
|| array_to_string(col_list, ',') 
|| ', SUM(wert_monat_kum) AS Total FROM susa2 GROUP BY pk'; 
OPEN result NO SCROLL FOR EXECUTE query; 
RETURN result; 
END; 
$$ LANGUAGE plpgsql STRICT; 

ich meine Daten anschließend ausführen:

BEGIN; 
SELECT do_cross_cursor(); 
FETCH ALL FROM result; 
END; 

In es eine Möglichkeit, FETCH ALL FROM result; zu lassen in eine Ansicht fließen?

+0

Ich bin hübsch Sie können das nicht tun. Die Sicht, die sich ergeben würde, hätte eine variable/dynamische Anzahl von Spalten basierend auf dem, was "gekreuzt" wurde, und die Daten in der Tabelle für dieses bestimmte gekreuzte Feld, so dass die resultierende Menge von Daten ein dynamisches Schema hat. Gut für einen Cursor, nicht so für eine Ansicht. – JNevill

Antwort

0

Beantworten Sie Ihre Frage: Nein. view erfordert alle definierten Spalten und Sie können nicht holen, um die Definition anzuzeigen. Aber Sie können Abhilfe schaffen. smth wie:

select DISTINCT 
pk, jahrmonat,count(1) over (partition by pk,jahrmonat), SUM(wert_monat_kum) AS Total 
FROM susa2 

sollten Sie dieselben Daten geben, vertikal, so dass Sie can trycrosstab es zu einem Datensatz transfrom.

+1

Danke für Ihre Antwort. Ich habe versucht, mit "Kreuztabellen" das gewünschte Ergebnis zu erzielen und hatte das gleiche Problem, dass die Anzahl der geschwenkten Spalten dynamisch ist. Vielleicht muss ich meine Anwendung/SQL-Design etwas überdenken. – yrrgarten

Verwandte Themen