Pętla + cursor PL/pgSQL

0

Rozpoczynam przygodę z językiem PL/pgSQL i natrafiłem na problem w trakcie pisania kursora połączonego z pętlą. Polega on na tym że nie działa pętla i otrzymuje tylko jeden wiersz. Prośba o pomoc :)

 
CREATE OR REPLACE FUNCTION bi.temp_cursor()
RETURNS refcursor AS
$BODY$
DECLARE
kursor cursor for SELECT //DANE1//, //DANE2 //FROM //SCHEMAT//.//TABELA// LIMIT 1000;
ref2 RECORD;

BEGIN
	OPEN kursor; 
	LOOP
		FETCH kursor INTO ref2;
		EXIT WHEN NOT FOUND;
		RETURN ref2;
	END LOOP;
	CLOSE kursor; -- tego nie trzeba wpisywac
END;
$BODY$
LANGUAGE plpgsql;
0

Przypuszczam, że ten Return kończy Ci procedurę. Po pierwsze ja bym użył pętli for:
http://www.techonthenet.com/oracle/loops/for_loop.php
po drugie jak rozumiem chcesz zwrócić zbiór danych, a nie jeden rekord (bo po coś Ci ta pętla jest) jeśli tak to musisz sobie zdefiniować typ tablicowy jego uzupełniać w pętli i w returnie zwrócić ten typ np coś takiego:
https://docs.oracle.com/cd/A57673_01/DOC/server/doc/PLS23/ch4.htm
Sposobów jest kilka jak np tablice tymczasowe, typy tablicowe, zmienne w pakietach itd. Określ co potrzebujesz dokładnie to podpowie Ci się najlepszą metodę ;)

0

@woolfik
Jeżeli chodzi o typ tablicowy to jest zrozumiałe:
RETURNS TABLE (DANE1 TYP1, DANE2 TYP2) AS

Natomiast ciężko mi sobie wybrazić pętle FOR... Mógłbyś podsunąć jakieś rozwiązanie ?

0

Napisałem coś takiego:

CREATE OR REPLACE FUNCTION funkcja_cursor ()
  RETURNS TABLE(player integer, rej timestamp without time zone) AS
$BODY$
DECLARE
kursor cursor for SELECT player_id, ts FROM "fish-tsg".registration LIMIT 1000;

BEGIN
	FOR a IN kursor LOOP
	RETURN NEXT;
	END LOOP;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE; 

Problemem jest to że dostaje puste kolumny, bez wartości :/

0

Z głowy piszę ale chodzi mniej więcej o coś takiego

CREATE OR REPLACE FUNCTION funkcja_cursor ()
  RETURNS TABLE(player integer, rej timestamp without time zone) AS
$BODY$
declare
  tab twoj_typ_tablicowy;
BEGIN
	FOR a IN (SELECT player_id, ts FROM "fish-tsg".registration LIMIT 1000) LOOP
	  insert do twojej tab  jak values podajesz (a.player_id, a.ts);
	END LOOP;
        return tab;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE; 
0

@woolfik
Wydaje mi się, że w mojej funkcji brakuje INSERTU danych do tabeli

Co do Twojej funkcji to ciężko mi powiedzieć co wpisać w typie_tablicowym... Próbuje na różne sposoby, ale za każdym razem dostaje SYNTAX.

Pomożesz ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1