mehrere zeilen als ergebnis einer perlfunktion

Fragen, Probleme etc. zu den prozedularen Sprachen ( PL/Tcl, PL/Perl und PL/Python).
gnoerz
Benutzer
Beiträge: 94
Registriert: Mo 16. Jan 2006, 22:10

mehrere zeilen als ergebnis einer perlfunktion

Beitrag von gnoerz » Mi 27. Feb 2008, 00:34

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

Code: Alles auswählen

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

gnoerz
Benutzer
Beiträge: 94
Registriert: Mo 16. Jan 2006, 22:10

Beitrag von gnoerz » Mi 27. Feb 2008, 00:39

ich habs gefunden.

nicht

Code: Alles auswählen

select test();
, sondern

Code: Alles auswählen

select * from test()
.

hrgh.

Wolf
Neuer Benutzer
Beiträge: 26
Registriert: Fr 19. Sep 2008, 15:18

Return all

Beitrag von Wolf » Mo 15. Dez 2008, 14:49

So mal wieder hier Spinnweben weg machen.


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

Code: Alles auswählen

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!?

akretschmer
Erfahrener Benutzer
Beiträge: 7645
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Mo 15. Dez 2008, 15:07

Wolf hat geschrieben: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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Wolf
Neuer Benutzer
Beiträge: 26
Registriert: Fr 19. Sep 2008, 15:18

Beitrag von Wolf » Mo 15. Dez 2008, 15:15

akretschmer hat geschrieben: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.

akretschmer
Erfahrener Benutzer
Beiträge: 7645
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Mo 15. Dez 2008, 15:27

Wolf hat geschrieben: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: Alles auswählen

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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Wolf
Neuer Benutzer
Beiträge: 26
Registriert: Fr 19. Sep 2008, 15:18

Beitrag von Wolf » Mo 15. Dez 2008, 15:29

Code: Alles auswählen

-- Function: test()

 DROP FUNCTION test();

CREATE FUNCTION test()
RETURNS SETOF [B]track[/B] AS $$

SELECT * FROM [B]track[/B];

$$ LANGUAGE SQL;



Abfrage: select * from test();
Ergebnis: ist gleich wie select * from track();

akretschmer
Erfahrener Benutzer
Beiträge: 7645
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Mo 15. Dez 2008, 15:34

Wolf hat geschrieben:

Code: Alles auswählen

-- Function: test()

 DROP FUNCTION test();

CREATE FUNCTION test()
RETURNS SETOF [B]track[/B] AS $$

SELECT * FROM [B]track[/B];

$$ LANGUAGE SQL;



Abfrage: select * from test();
Ergebnis: ist gleich wie select * from track();



Ja, und? Problem nun gelöst oder alle Klarheiten beseitigt?
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Wolf
Neuer Benutzer
Beiträge: 26
Registriert: Fr 19. Sep 2008, 15:18

Beitrag von Wolf » Mo 15. Dez 2008, 15:48

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.



akretschmer
Erfahrener Benutzer
Beiträge: 7645
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Mo 15. Dez 2008, 15:57

Wolf hat geschrieben: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: Alles auswählen

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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten