2016-10-06 4 views
0

Ich habe Funktion in PostgreSQL, wenn ich die Ergebnisse zurückgeben möchte ich eine Fehlermeldung anzeigt:Wie kann ich das Ergebnis der Abfrage in Postgres zurückgeben?

ERROR: query has no destination for result data 
    HINT: If you want to discard the results of a SELECT, use PERFORM instead. 

Hier wird Zusammenfassung meiner Funktion (es ist zu lange kopieren/einfügen hier alle Code)

CREATE OR REPLACE FUNCTION "schema"."test"(IN Id int8,) 

RETURNS TABLE("Id" uuid, "SiteId" uuid, "Domain" varchar, 
"JumpCost" numeric, "CPMCost" numeric, "PaymentModel" int8, "ComputedEpm" numeric, 
"ClickedCampaignId" int8, "MainRubricId" int8, "ShowSlider" bool, 
"ShowGoods" bool, "ShowTeaser" bool, "BidLimitCoeff" numeric, 
"RtbActiveSiteStatByBannerId" int8, "ShowType" int8, "MinAge" int8) AS 

$BODY$ 

DECLARE 
    rtbCampaignEpmCoeff NUMERIC(18,6); 
    maxRubricShows int; 
    showsRubricAddedPerClick int; 
    siteLossLimitPerRubric NUMERIC(18,6); 
    rtbMinRubricVisitsToShow int; 
    showAdsToUsersWithoutInterests boolean; 

BEGIN 
...... 

DO 
$do$ 
...... 
$do$; 

PERFORM "Id", "SiteId", "Domain", "JumpCost", "CPMCost", "PaymentModel", 
5 as ComputedEpm, "ClickedCampaignId", "MainRubricId", "ShowSlider", 
"ShowGoods", "ShowTeaser", "BidLimitCoeff", "RtbActiveSiteStatByBannerId", 
"ShowType", "MinAge" 

FROM mytable 

ORDER BY "FromClick" DESC, "Similarity" DESC, "rn", random() 
LIMIT 1; 

END; 

$BODY$ 
LANGUAGE plpgsql 
COST 100 
CALLED ON NULL INPUT 
SECURITY INVOKER 
VOLATILE; 

Wie Sie sehen, habe ich "PERFORM" verwendet, um Ergebnisse zurückzugeben, aber mit Fehler fehlgeschlagen, erklärte ich.

Auch ich habe "Return query .." und habe den gleichen Fehler.

"Mytable" ist temporäre Tabelle, die ich in Funktion erstellt habe.

Wie kann ich dieses Ergebnis zurückgeben?

+2

Sie wollen 'Rückfrage '. Siehe das Handbuch für Details, es ist alles dort erklärt: https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING Unrelated, aber: Sie sollten ** wirklich * * vermeiden Sie diese gefürchteten zitierten Identifikatoren, sie sind viel mehr Ärger als sie es wert sind. –

+1

Warum verwenden Sie einen anonymen "DO" -Code, wenn Sie bereits in einer Funktion sind? –

+0

Eines Ihrer Probleme besteht darin, dass Sie dieselben Namen für die Ausgabeparameter und die Spalten der Tabelle verwenden, die Sie zurückgeben möchten. Das führt zu Namenskollisionen und überraschenden Fehlern, die schwer zu debuggen sind. Vermeiden Sie es, indem Sie die Ausgabeparameter anders benennen, wie 'p_id' und' p_siteid'. Und übrigens, möglichst Groß- und Kleinschreibung vermeiden. –

Antwort

3

vielleicht so etwas?

+0

Ich erwähnte, dass ich mit RETURN QUERY EXECUTE versuchte! – Nikito

+0

Ja, aber Sie haben den Code nicht angezeigt. 'RETURN QUERY' funktioniert in diesem Fall gut, vielleicht hast du irgendwo einen Fehler gemacht. –

+0

Fehler war über Schema, ich habe keinen Spaltennamen mit Schema-Präfix angegeben. Vielen Dank. – Nikito

Verwandte Themen