Zuweisungen mit '=' und bei composite types

Hallo zusammen,

ich lerne gerade PostgreSQL (8.3.7) kennen (berufsbedingt) und arbeite mich in Pl/Pgsql ein. Mache also meine ersten Gehversuche. Beim Testen bin ich darauf gestoßen, dass eine Zuweisung auch mit ‘=’ funktioniert (sollte doch ‘:=’ sein). Und anscheinend kann man auch unterschiedliche Composite Types einander zuweisen, wenn die Basis-Datentypen passen.
Sind das Features ? Sollte man die Finger davon lassen ?
Mich würde interessieren, was da im Hintergrund passiert. Kann man das irgendwo nachlesen ?

Hier mein Beispiel-Code:

create or replace function test_assign() returns void as $$
DECLARE
    i         integer;

    dat_1     data;
    extdat_1  extended_data;
    dat_2     data;
    extdat_2  extended_data;
    dat_3     data;
    extdat_3  extended_data;
    alien     alien_data;BEGIN
    i = 3;                                  -- falsch, sollte heissen : i := 1; wieso funktioniert das ??
    raise notice 'integer i : %', i;
    i = i+1;                                -- falsch, sollte heissen : i := i + 1;
    raise notice 'integer i : %', i;

    dat_1    := (3.141,'pi',TRUE);
    extdat_2 := (2.718,'auch berühmt',TRUE,1234567890);
    extdat_3 := (0.0,NULL,TRUE,9876543210);

    extdat_1 := dat_1;
    dat_2    := extdat_2;                   -- Zuweisungen funktionieren, was passiert da ??
    dat_3    := extdat_3;
    -- alien    := extdat_2;                -- ERROR:  invalid input syntax for type boolean: "auch berühmt"

    raise notice '                    dat_1    = %' , dat_1;
    raise notice 'extdat_1 := dat_1;  extdat_1 = %' , extdat_1;
    raise notice '                    extdat_2 = %' , extdat_2;
    raise notice 'dat_2 := extdat_2;  dat_2    = %' , dat_2;
    raise notice '                    extdat_3 = %' , extdat_3;
    raise notice 'dat_3 := extdat_3;  dat_3    = %' , dat_3;

    -- raise notice 'alien := extdat_2;  alien    = %' , alien;
END;

$$ language plpgsql;

Wollte noch die Ausgabe des Codes zeigen, … aber die Vorschau streikt. Gibt’s eine Längenbeschränkung ???

Also, ja, wenn der Kontext eine Zuweisung ist, ist := und = gleichwertig. Und zu den Composite Types: PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Composite Types


Andreas

Hi Andreas,

habe verstanden. Manual lesen ist natürlich Pflicht ;-). In Kapitel 8.15 steht drin was ein Composite Type ist, aber nicht wie er sich verhält :-). Daher meine Frage … und danke für die schnelle Antwort.

Das ist übrigens die Ausgabe des Codes :

NOTICE: integer i : 3
NOTICE: integer i : 4
NOTICE: dat_1 = (3.141,pi,t)
NOTICE: extdat_1 := dat_1; extdat_1 = (3.141,pi,t,)
NOTICE: extdat_2 = (2.718,“auch berühmt”,t,1234567890)
NOTICE: dat_2 := extdat_2; dat_2 = (2.718,“auch berühmt”,t)
NOTICE: extdat_3 = (0.0,t,9876543210)
NOTICE: dat_3 := extdat_3; dat_3 = (0.0,t)

P.S.: Kann man eine nicht funktionierende Vorschau ignorieren, oder gibt’s in dem Fall wirklich Müll ?