mehrere zeilen als ergebnis einer perlfunktion

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

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

ich habs gefunden.

nicht

select test();

, sondern

select * from test()

.

hrgh.

So mal wieder hier Spinnweben weg machen.


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

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

Er hat mit einer SRF gespielt und diese flasch aufgerufen.

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]
[/quote]
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.

[quote]
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!?[/quote]

Lesen. Und zwar PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Query Language (SQL) Functions

Andreas

>

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.



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

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

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:

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

Ich werd mir wohl demnächst pllolcode installieren und damit antworten…

Andreas