Hallo!
Helft mal bitte einem access-geschädigten Newbie.
Ich versuche mit pgAmin eine Funktion zu erstellen, die zu einer AdressNr die passende LieferNr aus einen Tabelle liefert.
Das mit der “AdressNr”=301 sollte “AdressNr”=AdrNr sein geht aber nicht.
Fehler: >>Spalte AdrNr<< existiert nicht
CREATE OR REPLACE FUNCTION "LNFnummer"("AdrNr" integer)
RETURNS integer AS
$BODY$Select "LieferNr"
from "tblAdressenkopf"
Where "AdressNr"=301;$BODY$
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION "LNFnummer"(integer)
OWNER TO master;
Wie wird denn der Parameter verpackt?
Was macht das $BODY$?
CREATE OR REPLACE FUNCTION “LNFnummer”(“AdrNr” integer)
RETURNS integer AS
$BODY$Select “LieferNr”
from “tblAdressenkopf”
Where “AdressNr”=301;$BODY$
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION “LNFnummer”(integer)
OWNER TO master;
>
> Wie wird denn der Parameter verpackt?
> Was macht das $BODY$?
>
> Gruß Mafi
Wann kommt der Fehler?
```text
test=# create table "tblAdressenkopf" ( "LieferNr" int, "AdressNr" int);
CREATE TABLE
test=*# CREATE OR REPLACE FUNCTION "LNFnummer"("AdrNr" integer)
RETURNS integer AS
$BODY$Select "LieferNr"
from "tblAdressenkopf"
Where "AdressNr"=301;$BODY$
LANGUAGE sql VOLATILE
COST 100;
CREATE FUNCTION
test=*# select * from "LNFnummer"(1);
LNFnummer
-----------
(1 row)
Das $BODY$ markiert den Body der Funktion. Es reicht $$, oder aber $WEIHNACHTEN_IST_VORBEI$ oder irgend etwas anderes.
Also nochmal!
Wie geht das bei PG mit der Übergabe des Parameters einer Funktion in den SQL-String, der in der Funktion ausgeführt werden soll.
Setze ich den Parameter AdrNr mit oder ohne “” ein wird er als Spalte interpretiert.
Setze ich statt AdrNr einen Wert z.B. 301 ein, so wird die Funktion ohne Fehlermeldung gespeichert.
Ist PG in der Lage den Feldinhalt des Abfrageergebnis an die Funktion als Rückgabewert zu übergeben?
Oder muß da noch eine Zuweisung in den Code (funktionxy=LieferNr)?
test=# select * from foo;
s
----
1
2
6
7
8
9
10
20
40
60
(10 rows)
test=*# create or replace function get_foo(int) returns int as $$select s from foo where s=$1; $$language sql;
CREATE FUNCTION
test=*# select * from get_foo(2);
get_foo
---------
2
(1 row)
test=*# create or replace function get_foo(a int) returns int as $$select s from foo where s=a; $$language sql;
CREATE FUNCTION
test=*# select * from get_foo(8);
get_foo
---------
8
(1 row)
Da bin ich dem pgAdmin voll auf den Leim gegangen:
jetzt hab ich die “” entfernt und alles ist schick!
CREATE OR REPLACE FUNCTION lfn(adrnr integer)
RETURNS integer AS
$BODY$Select "LieferNr"
from "tblAdressenkopf"
Where "AdressNr"=$1;$BODY$
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION lfn(integer)
OWNER TO master;
wenn’s der pgAdmin macht sieht so aus:
CREATE OR REPLACE FUNCTION "LFN2"("AdrNr" integer)
RETURNS integer AS
$BODY$Select "LieferNr"
from "tblAdressenkopf"
Where "AdressNr"=$1;$BODY$
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION "LFN2"(integer)
OWNER TO master;