webentwicklung-frage-antwort-db.com.de

Schleife über die Array-Dimension in plpgsql

In plpgsql möchte ich den Array-Inhalt einzeln aus einem zweidimensionalen Array abrufen.

DECLARE
  m varchar[];
  arr varchar[][] := array[['key1','val1'],['key2','val2']];
BEGIN
  for m in select arr
  LOOP
    raise NOTICE '%',m;
  END LOOP;
END;

Der obige Code gibt jedoch Folgendes zurück:

{{key1,val1},{key2,val2}}

in einer Zeile. Ich möchte in der Lage sein, eine andere Funktion aufzurufen, die Parameter wie:

another_func(key1,val1)
44
Harpreet

Seit PostgreSQL 9.1 gibt es das praktische FOREACH :

DO
$do$
DECLARE
   m   varchar[];
   arr varchar[] := array[['key1','val1'],['key2','val2']];
BEGIN
   FOREACH m SLICE 1 IN ARRAY arr
   LOOP
      RAISE NOTICE 'another_func(%,%)',m[1], m[2];
   END LOOP;
END
$do$

Lösung für ältere Versionen :

DO
$do$
DECLARE
   arr varchar[] := '{{key1,val1},{key2,val2}}';
BEGIN
   FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
   LOOP
      RAISE NOTICE 'another_func(%,%)',arr[i][1], arr[i][2];
   END LOOP;
END
$do$

Auch gibt es keinen Unterschied zwischen varchar[] und varchar[][] für das PostgreSQL-Typensystem. Ich erkläre genauer hier .

Die DO -Anweisung erfordert mindestens PostgreSQL 9.0 und LANGUAGE plpgsql ist die Standardeinstellung (daher können Sie die Deklaration weglassen).

97