Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: mehrere zeilen als ergebnis einer perlfunktion

  1. #1
    gnoerz ist offline Benutzer
    Registriert seit
    16.01.2006
    Beiträge
    94

    Standard mehrere zeilen als ergebnis einer perlfunktion

    ich würde gerne eine perl-funktion schreiben, die mehr als eine zeile zurückliefert.

    Code:
    CREATE OR REPLACE FUNCTION test()
    RETURNS SETOF text AS $$
    
        return_next("bla");
        return_next("fasel");
        return_next("hurz");
        
        return undef;
    $$ LANGUAGE plperl
    bringt nur:

    ERROR: set-valued function called in context that cannot accept a set
    SQL Status:0A000


    PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Database Access from PL/Perl ist mir bekannt, aber offenbar bin ich zu doof.

    tom

  2. #2
    gnoerz ist offline Benutzer
    Registriert seit
    16.01.2006
    Beiträge
    94

    Standard

    ich habs gefunden.

    nicht
    Code:
    select test();
    , sondern
    Code:
    select * from test()
    .

    hrgh.

  3. #3
    Wolf ist offline Neuer Benutzer
    Registriert seit
    19.09.2008
    Beiträge
    26

    Frage Return all

    So mal wieder hier Spinnweben weg machen.


    Habe auch gerade das gleich problem werde aber nicht schlau daraus was du gepostet hast.

    Code:
    CREATE OR REPLACE FUNCTION test()
      RETURNS integer AS
    $BODY$
    declare
    v_t integer;
    begin
    
    select * into v_t from track;
    
    return v_t ;
    
    end;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE;
    ALTER FUNCTION test() OWNER TO postgres;
    Mein Ziel ist, den kompletten Inhalt angezeigt zu bekommen, wenn ich die Methode test() aufrufe.

    Abfrage: select * from test();
    Ergebnis: Z1 Sp1 Bu1 => 12

    Abfrage: select * from track;
    Ergebnis: Z1 Sp20 Bu20 => ...

    Was muss ich der Funktion ändern damit ich alles zurück bekomme!?

  4. #4
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Wolf Beitrag anzeigen
    So mal wieder hier Spinnweben weg machen.


    Habe auch gerade das gleich problem werde aber nicht schlau daraus was du gepostet hast.
    Er hat mit einer SRF gespielt und diese flasch aufgerufen.

    [code]
    CREATE OR REPLACE FUNCTION test()
    RETURNS integer AS
    $BODY$
    declare
    v_t integer;
    begin

    select * into v_t from track;

    return v_t ;

    end;
    $BODY$
    LANGUAGE 'plpgsql' VOLATILE;
    ALTER FUNCTION test() OWNER TO postgres;
    //code]
    Das ist schon mal bullshit. Deine Variable ist geeignet, einen INT zu speichern. Einen, wohlgemerkt. Deine Abfrage versucht, ein ganze Tabelle (besteht aus Zeilen und Spalten) in diese Variable zu packen. Das kann nicht gehen.

    Mein Ziel ist, den kompletten Inhalt angezeigt zu bekommen, wenn ich die Methode test() aufrufe.

    Abfrage: select * from test();
    Ergebnis: Z1 Sp1 Bu1 => 12

    Abfrage: select * from track;
    Ergebnis: Z1 Sp20 Bu20 => ...

    Was muss ich der Funktion ändern damit ich alles zurück bekomme!?
    Lesen. Und zwar PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Query Language (SQL) Functions

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    Wolf ist offline Neuer Benutzer
    Registriert seit
    19.09.2008
    Beiträge
    26

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Deine Variable ist geeignet, einen INT zu speichern. Einen, wohlgemerkt. Deine Abfrage versucht, ein ganze Tabelle (besteht aus Zeilen und Spalten) in diese Variable zu packen. Das kann nicht gehen.
    Mit integer ist klar das kann nicht gehen.

    So habe ich aber immer hin ein Ergebnis bekommen.

    Desweiteren habe ich auf dieser Seite nach geschaut wo ich so erst mal nix gefunden hatte.

  6. #6
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Wolf Beitrag anzeigen
    Mit integer ist klar das kann nicht gehen.

    So habe ich aber immer hin ein Ergebnis bekommen.

    Desweiteren habe ich auf dieser Seite nach geschaut wo ich so erst mal nix gefunden hatte.
    Code:
    test=# create table foo (id int, info text);
    CREATE TABLE
    test=*# insert into foo values (1, 'read');
    INSERT 0 1
    test=*# insert into foo values (2, 'the');
    INSERT 0 1
    test=*# insert into foo values (3, 'manual');
    INSERT 0 1
    test=*# create or replace function foo_srf(out i int, out t text) returns setof record as $$declare r record; begin for r in select id, info from foo loop i:=r.id; t:=r.info; return next; end loop; end; $$language plpgsql;
    CREATE FUNCTION
    test=*# select * from foo_srf();
     i |   t
    ---+--------
     1 | read
     2 | the
     3 | manual
    (3 rows)

    PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Control Structures
    38.6.1.2. RETURN NEXT and RETURN QUERY


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    Wolf ist offline Neuer Benutzer
    Registriert seit
    19.09.2008
    Beiträge
    26

    Lächeln

    Code:
    -- Function: test()
    
     DROP FUNCTION test();
    
    CREATE FUNCTION test()
    RETURNS SETOF track AS $$
    
    SELECT * FROM track;
    
    $$ LANGUAGE SQL;
    Abfrage: select * from test();
    Ergebnis: ist gleich wie select * from track();

  8. #8
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Wolf Beitrag anzeigen
    Code:
    -- Function: test()
    
     DROP FUNCTION test();
    
    CREATE FUNCTION test()
    RETURNS SETOF track AS $$
    
    SELECT * FROM track;
    
    $$ LANGUAGE SQL;
    Abfrage: select * from test();
    Ergebnis: ist gleich wie select * from track();

    Ja, und? Problem nun gelöst oder alle Klarheiten beseitigt?
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    Wolf ist offline Neuer Benutzer
    Registriert seit
    19.09.2008
    Beiträge
    26

    Standard

    NOEP!!!!


    Aus deinem Post werde ich auch nicht schlau!! Geht das nur mit einer For schleife!?? Warum die Inputs!? Was ist wenn die Tabellen Größe nicht bekannt ist!?

    und das Manuel lese ich. Und wenn ich nix ralle dann frage ich!!!

    Kann man nicht einfach das was man Anfragt zurück geben lassen ohne ein For schleife darum zu bauen!?

    Problem ich kenne die Ergebnis Größe nicht.



  10. #10
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Wolf Beitrag anzeigen
    NOEP!!!!


    Aus deinem Post werde ich auch nicht schlau!! Geht das nur mit einer For schleife!?? Warum die Inputs!? Was ist wenn die Tabellen Größe nicht bekannt ist!?

    und das Manuel lese ich. Und wenn ich nix ralle dann frage ich!!!

    Kann man nicht einfach das was man Anfragt zurück geben lassen ohne ein For schleife darum zu bauen!?

    Problem ich kenne die Ergebnis Größe nicht.


    Du solltest Dich vielleicht erst einmal auf eine Sprache festlegen. Der Thread handelt von plperl, Du verwendest mal plpgsql und mal reines sql.

    Zu Deiner Frage: natürlich:

    Code:
    test=# create table foo as select * from generate_Series(1,4);
    SELECT
    test=# create or replace function get_foo() returns setof record as $$ select * from foo; $$language sql;
    CREATE FUNCTION
    test=# select * from get_foo() as (i int);
     i
    ---
     1
     2
     3
     4
    (4 rows)
    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum