function: Parameterübergabe per value oder reference

Hallo,

ich habe keinen Hinweis gefunden, ob die Parameter einer Funktion per value oder reference übergeben werden. Kann mit jemand eine Information dazu geben?

Viele Grüße

value

@akretschmer

Danke fuer die schnelle Antwort.

Habe ich das richtig verstanden: Wenn ich als Parameter eine Tabelle angebe, dann wir die ganze Tabelle per copy uebergeben?

PS: Ich verwende PL/pgSQL

ähm, vielleicht hab ich dich falsch verstanden, was genau machst du?

Bsp.: Eine Tabelle “tbTest”. Diese Tabelle soll in einer Funktion “fnTest” auf definierte Kriterien hin untersucht werden:

ergebnis = fnTest( tbTest );

Wird der Funktion eine Referenz auf die Tabelle oder eine Kopie der Tabelle übergeben? Der Parameter fuer tbTest ist als IN-Parameter definiert:

fnTest( table_ tbTest ) RETURNS Integer

PS: Im realen Kode ist “tbTest” eine Basistabelle von der die verschiedenen anderen Tabellen abgeleitet sind (aus diesem Grund die Funktion).

Du kannst keine Tabelle als Parameter übergeben, höchstens den Namen einer Tabelle. Was machst Du dann innerhalb? ich vermute ja irgend etwas mit execute, oder?

Wenn ich das richtig verstehe, dann geht es dir darum, wie die Parameter gehandhabt werden. Naja, die werden natürlich als Value übergeben.
Ob das ein Tabellenname ist, oder ein String ist ja reichlich egal. Relevant ist ja hier, was du dann in der Funkion damit machst.
Der Interpreter kann ja schlecht orakeln, was du ihm da übergibst bzw. warum und was du damit machen willst (Also ob String,Tabelle,Integer,null).

'Wäre das eine Antwort auf deine Frage, oder hab ich hier was ganz falsch verstanden?

@akretschmer

Ich hatte aus einer anderen Quelle den Hinweis, dass man einer “function” eine Tabelle uebergeben kann (Das Objekt, nicht den Namen). Dem ist wohl nicht so. Damit hat sich das Thema erledigt.

Danke fuer die Muehen.

Du meinst vielleicht Cursor?

http://www.postgresql.org/docs/9.4/static/plpgsql-cursors.html

In dem Beispiel wurde eine existierende Tabelle an der Schnittstelle uebergeben, nicht der Name (string) und kein Cursor. Bei mir kam sofort die Frage auf, wie denn die Tabelle uebergeben wird, so z. bsp bei IN-Parameter per copy (ineffizient) und bei INOUT als reference (Daten nicht schreibgeschuetzt).

Jetzt habe ich das angegebene Beispiel abgetippt und es funktioniert nicht, obwohl eine Tabelle kann als Typ angegeben werden kann (Den Test haette ich wohl vor meiner Frage machen sollen). Da ist die Art der Uebergabe schon zweitrangig.

Ich werde die Tabellen wie bisher mit dem typ regclass uebergeben und mit EXECUTE FORMAT( … ); auswerten.

Oder schlagen Sie eine andere Methode vor?

paßt so.