2016-04-25 10 views
0

Ich verwende eine gespeicherte Prozedur, um den Typ des Schülers zurückzugeben, der an meiner Hochschule angemeldet ist. Wenn Sie ihre ID weiterleiten, sollten Sie ihren Vor- und Nachnamen in einer neuen Spalte angeben, die erstellt werden soll (z. B. Pendler, Mitarbeiter, Bewohner). Ich erhalte immer einen Fehler:Erstellen benutzerdefinierter Spalten in postgres für gespeicherte Prozeduren

ERROR: syntax error at or near "if" 
LINE 8:  if exists (select count(commuterid) > 0 from commuter wh...). 

Irgendwelche Tipps oder Ideen?

create or replace function roleAtMarist(int, REFCURSOR) returns refcursor as 
$$ 
declare 
    identifier  int := $1; 
    resultset refcursor := $2; 
begin 
    open resultset for 
    if exists (select count(commuterid) > 0 from commuter where commuterid = identifier) then 
     select fname, lname, "Commuter" as Role 
     from people 
     where peopleid = identifier; 
    end if; 

    if exists (select count(employeeid) > 0 from employee where emplpoyeeid = identifier) then 
     select fname, lname, "Employee" as Role 
     from people 
     where peopleid = identifier; 
    end if; 

    if exists (select count(residentid) > 0 from studentpark where residentid = identifier) then 
     select fname, lname, "Resident" as Role 
     from people 
     where peopleid = identifier; 
    end if; 
return resultset; 
end; 
$$ 
language plpgsql; 
select roleAtMarist(12, 'resultset') ; 
fetch all from results ; 

Antwort

0

Dies ist in mehrfacher Hinsicht rückwärts. Ein Cursor würde gültige SQL- und keine plpgsql-Befehle verwenden. Aber Sie brauchen weder einen Cursor noch plpgsql. Eine einfache SQL-Funktion tun soll:

CREATE OR REPLACE FUNCTION role_at_marist(_identifier int) 
    RETURNS TABLE (fname text, lname text, "role" text) AS 
$func$ 
    SELECT p.fname, p.lname, text 'Commuter' 
    FROM people 
    WHERE p.peopleid = $1 
    AND EXISTS (SELECT 1 FROM commuter c WHERE c.commuterid = p.peopleid) 

    UNION ALL 
    SELECT p.fname, p.lname, 'Employee' 
    FROM people 
    WHERE p.peopleid = $1 
    AND EXISTS (SELECT 1 FROM employee e WHERE e.emplpoyeeid = p.peopleid) 

    UNION ALL 
    SELECT p.fname, p.lname, 'Resident' 
    FROM people 
    WHERE p.peopleid = $1 
    AND EXISTS (SELECT 1 FROM studentpark s WHERE s.residentid = p.peopleid) 
$func$ LANGUAGE sql; 

Call:

SELECT * FROM role_at_marist(12); 

Set-Rückkehr Funktionen können wie Tabellen in der FROM Liste verwendet werden.
String-Literale sind in Anführungszeichen eingeschlossen!

+0

Ich habe diesen Code ausgeführt und einen Fehler erhalten: Spalte "Pendler" existiert nicht. – Zeke

+0

Diese Spalte ist nicht in Personen, aber ich verstehe, wo Sie versucht haben, darauf zuzugreifen von ... role_at_marist. – Zeke

+0

@ Zeke. Das machen Sie in Ihrem Code: 'wählen Sie fname, lname," Pendler "als Rolle von Personen. Ich nehme an, Sie wissen, dass Doppel-Bezeichner die Groß- und Kleinschreibung beachten? http://StackOverflow.com/a/20880247/939860 –

Verwandte Themen