Array an Function übergen

Moin,

ich habe das Problem, INPUT-Parameter an eine Function zur weiteren Verarbeitung zu übergeben. Da ich sicher bin, daß sich die Anzahl der Parameter im Laufe der Zeite erhöht, wollte ich die Daten gleich als array implementieren, in etwa so:

create or replace function test(p_daten varchar[]) 
...
...
declare
  l_temp varchar(50);
begin
  ...
  l_temp := p_daten[1];
  -- mache etwas mit l_temp
  ..
  l_temp := p_daten[2]
end;

Der Debugger sagt stets, daß das array leer ist ? Was mach ich falsch aber wichtiger noch, wie mache ich es richtig.

Vielen Dank für die Hilfe
iscu

Warum definierst Du l_temp als Array, wenn Du dann nur einen singulären Wert übergibst?

Der Hintergrund ist folgender, für z.B.eine Stammdatenverwaltung von Artikeln will ich nicht jedesmal die IN-Parameter erweitern. Ich dachte, ich übergebe die Daten via einem Array:

p_daten[1] => Artikelnummer
p_daten[2] => Bezeichnung
usw.
Da eine Artikelbeschreibung häufig sehr Umfangreich ausfällt und im Laufe der Zeit neue Eigenschaften hinzukommen, will ich ein Array verwenden. Ich brauche dann nur im Frontend die notwendigen Array-Einträge aufnehmen und diese dann im Backend auswerten.

Der Sinn erschließt sich mir nicht: die Funktion musst Du doch eh ändern, wenn neue Eigenschaften hinzukommen.
Wenn Du die jedoch in die Parameterliste der Funktion mit aufnimmst, kann man doch auch sofort sehen, welche Parameter übergeben werden müssen. Insbesondere dann, wenn “sprechende” Namen für die Parameter verwendet werden…
Das macht es dann auch für andere einfacher, den Code zu verstehen.

Wo ist das Problem?

CREATE OR REPLACE FUNCTION test(p_daten varchar[])
RETURNS text AS
$BODY$
declare
  l_temp varchar(50);
begin
  l_temp := p_daten[1];
  -- mache etwas mit l_temp
  l_temp := p_daten[2];
  return l_temp;
end;
$BODY$LANGUAGE plpgsql VOLATILE;
SELECT * from test('{test,test2}');

Ausgabe:

 test2

@achilles_69
Es soll nur eine Vereinfachung sein, wenn z.B. ein Artikel 50-60 Eigenschaften hat, dann wird die Parameterliste schon sehr lang. Man kann natürlich die Datenerfassung im Frontend in Gruppen zur Verarbeitung anbieten, was ich auch machen werden.

@pfuetz
Ich werde es morgen probieren, kann sein, daß ich bisher den falschen Datentyp verwendet habe.

Vielen Dank für Eure Unterstützung

Hi,

ich hatte in der Parameterliste noch 2 OUT-Parameter, die waren das Problem, nehme ich sie raus funktionierts.

Vielen Dank

Bei 50 bis 60 Eigenschaften - die sich auch noch ändern können - würde ich über eine andere Struktur der Datenbank nachdenken. Sprich: normalisieren.
Das macht vielleicht die Tabellenstruktur auf den ersten Blick komplexer, aber es ist dann wesentlich einfacher neue Eigenschaften aufzunehmen.

Kann ich nur zustimmen! Aber für andere Einsatzzwecke ist das Beispiel ja trotzdem interessant.