2009-12-23 9 views
24

Ich versuche eine Funktion mit PostgreSQL zu verwenden, um einige Daten zu speichern. Hier ist das Skript erstellen:So rufen Sie eine Funktion, PostgreSQL

-- Function: "saveUser"(integer, character varying, character varying, character varying, character varying, character varying) 

-- DROP FUNCTION "saveUser"(integer, character varying, character varying, character varying, character varying, character varying); 

CREATE OR REPLACE FUNCTION "saveUser"("pUserID" integer, "pName" character varying, "pLastName" character varying, "pUserName" character varying, "pPassword" character varying, "peMail" character varying) 
    RETURNS boolean AS 
$BODY$ 
BEGIN 
SELECT 1 
FROM "USERS" 
WHERE "userID" = $1; 

IF FOUND THEN 
UPDATE "USERS" 
    SET  "name" = $2, 
    "lastName" = $3, 
    "userName" = $4, 
    "password" = $5, 
    "eMail" = $6 
WHERE "userID" = $1; 
ELSE 
    INSERT INTO "USERS" 
    ("name", "lastName", "userName", "password", "eMail") 
    VALUES 
     ($2, $3, $4, $5, $6); 
END IF; 
END;$BODY$ 
    LANGUAGE 'plpgsql' VOLATILE 
    COST 100; 
ALTER FUNCTION "saveUser"(integer, character varying, character varying, character varying, character varying, character varying) OWNER TO postgres; 

PostreSQL Dokumentation besagt, dass eine Funktion aufzurufen, die keine Suchresultates zurückkehrt, ist es ausreichend, nur seinen Namen und Eigenschaften zu schreiben. Also versuche ich, die Funktion wie folgt zu nennen:

"saveUser"(3, 'asd','asd','asd','asd','asd'); 

Aber ich habe den Fehler unten:

ERROR: syntax error at or near ""saveUser"" 
LINE 1: "saveUser"(3, 'asd','asd','asd','asd','asd') 
    ^

********** Error ********** 

ERROR: syntax error at or near ""saveUser"" 
SQL state: 42601 
Character: 1 

ich andere Funktionen haben, die eine Ergebnismenge zurück. Ich benutze SELECT * FROM "fnc"(...) um sie anzurufen und es funktioniert. Warum erhalte ich diesen Fehler?


EDIT: I pgAdmin III Abfrage-Tool bin mit und versuchen, die SQL-Anweisungen dort auszuführen.

Antwort

36

Der Funktionsaufruf sollte noch eine gültige SQL-Anweisung sein:

SELECT "saveUser"(3, 'asd','asd','asd','asd','asd'); 
+0

Damit bekomme ich den Fehler; "FEHLER: Abfrage hat kein Ziel für Ergebnisdaten". Ich frage mich, ob dieser Fehler etwas damit zu tun hat, dass ich einen booleschen Wert zurückgeben möchte? –

+0

Ich habe das mit einer anderen Funktion versucht, die void zurückgibt und es funktioniert, aber was, wenn ich einen boolean zurückgeben wollte? –

+2

Erkan: Versucht, die beiden Antworten zu kombinieren? I.e. Ihr Aufruf ist falsch und Sie geben nichts für eine Funktion zurück, von der erwartet wird, dass sie zurückkehrt. Außerdem, warum haben Sie Mixed-Case-Bezeichner, die Sie ständig angeben müssen? –

0

Sie deklarieren Ihre Funktion als Boolean zurückgeben, aber es gibt nie etwas zurück.

+0

ich die Zeile eingefügt, 'RETURN 1 = 1' am unteren Ende der Funktionsdefinition nur dies zu testen, nützten nichts. –

+1

Richtig, aber das gemeldete Problem wird dadurch nicht verursacht. –

4

wenn Ihre Funktion etwas nicht zurückkehren will man es auf „leer kommen“ und dann können Sie es wie nennen dies erklären sollte „perform Funktionsname (Parameter ...); "

+0

Das hat nicht für mich funktioniert –

1

Ich hatte das gleiche Problem beim Versuch, eine sehr ähnliche Funktion zu testen, die eine SELECT-Anweisung verwendet, um zu entscheiden, ob ein INSERT oder ein UPDATE durchgeführt werden soll. Diese Funktion war ein Umschreiben einer gespeicherten T-SQL-Prozedur.
Wenn ich die Funktion aus dem Abfragefenster getestet habe, bekam ich den Fehler "Abfrage hat kein Ziel für Ergebnisdaten". Das habe ich schließlich herausgefunden, weil ich innerhalb der Funktion eine SELECT-Anweisung verwendet habe, die ich nicht aus dem Abfragefenster testen konnte, bis ich die Ergebnisse von SELECT einer lokalen Variablen mit einer INTO-Anweisung zugewiesen hatte. Dies behebt das Problem.

Wenn die ursprüngliche Funktion in diesem Thread die folgenden geändert wurde, es würde funktionieren, wenn sie aus dem Abfrage-Fenster aufgerufen,

$BODY$ 
DECLARE 
    v_temp integer; 
BEGIN 
SELECT 1 INTO v_temp 
FROM "USERS" 
WHERE "userID" = $1; 
7

for SQL Server können Sie PERFORM verwenden. PERFORM ist nur innerhalb der PL/PgSQL-Prozedursprache gültig.

DO $$ BEGIN 
    PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd'); 
END $$; 

Der Vorschlag aus dem Postgres Team:

HINT: If you want to discard the results of a SELECT, use PERFORM instead.