Funktion mit Parameter in Select....

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$?

Gruß Mafi

Dazu reicht ein JOIN.

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$?
>
> 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.

Hallo Andreas!

Der Fehler tritt auf wenn ich im pgAdmin
auf dem Register Code

Select "LieferNr"
from "tblAdressenkopf"
Where "AdressNr"=AdrNr;

eingebe.

Dazu reicht ein JOIN.

Das mag sein. Ich übe aber gerade mit Funktionen und Parametern.
Da ist das Ziel: die generell zum Laufen zu kriegen, ob sinnvoll oder nicht.

Gruß Mafi

Dann wird es wohl so sein, oder?

Hallo!

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)?

Mafi

Vielleicht helfen Dir Beispiele weiter:

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)

Am besten gwöhnst Du Dir ab, Bezeichner in Anführungsstriche zu setzen.

Das macht das Leben ganz erheblich einfacher.
Details dazu findest Du im Handbuch: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

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;

Danke und Tschüss bis zum nächten Problem!

Mafi