PL/pgSQL - iteracja po rekordach


(Airborn) #1

Witam, próbowałem na kilka różnych sposobów rozwiązać ten problem, jednak nie udało się... W czym rzecz, chcę wybrać z tabeli pojedynczą kolumnę, a następnie zwrócić ją jako pojedynczy łańcuch znaków.

CREATE OR REPLACE FUNCTION select_tags(id integer) RETURNS text AS $$

	DECLARE

		temp RECORD;

		arr text[];

	BEGIN

		FOR temp IN SELECT t.tag_name FROM tag t JOIN news2tag n2t ON n2t.tag_id = t.tag_id WHERE n2t.news_id = id LOOP

			arr[] = temp.tag_name;

		END LOOP;

		RETURN array_to_string(arr, ', ');

	END;

	$$ LANGUAGE 'plpgsql';

Nie powiem, żeby komunikat serwera był dla mnie zbyt zrozumiały:

airborn=> SELECT select_tags(2);

ERROR: syntax error at end of input at character 8

QUERY: SELECT

CONTEXT: PL/pgSQL function "select_tags" line 6 at assignment

LINE 1: SELECT

               ^

airborn=>

Samo zapytanie SELECT jest oczywiście dobrze skonstruowane i dla konkretnej wartości zwraca prawidłowe wyniki.W dniu 10.05.2008 , o godzinie 0:18 został dopisany post przez Airbornhmm, no dobra, okazało się, że nie można przypisać po prostu do kolejnej wartości poprzez arr[], trzeba dołożyć indeks w tablicy

CREATE OR REPLACE FUNCTION select_tags(id integer) RETURNS text AS $$

	DECLARE

		temp RECORD;

		arr text[];

		i int;

	BEGIN

		FOR temp IN SELECT t.tag_name FROM tag t JOIN news2tag n2t ON n2t.tag_id = t.tag_id WHERE n2t.news_id = id LOOP

			arr[i] = temp.tag_name;

			i = i + 1;

		END LOOP;

		RETURN array_to_string(arr, ', ');

	END;

	$$ LANGUAGE 'plpgsql';

wywołanie funkcji nie powoduje już błędu, ale zwraca pusty wynik...W dniu 10.05.2008 , o godzinie 0:20 został dopisany post przez Airbornechhhh, ten język nigdy nie przestanie mnie zaskakiwać... i int nie wystarcza, i int = 1; już w zupełności, nie wiem jaką wartość przyjmuje nowo definiowany int, ale na pewno nie taką jakiej się wcześniej spodziewałem :stuck_out_tongue: gdyby komuś się kiedyś mogło do czegoś przydać...

CREATE OR REPLACE FUNCTION select_tags(id integer) RETURNS text AS $$

	DECLARE

		temp RECORD;

		arr text[];

		i int = 1;

	BEGIN

		FOR temp IN SELECT t.tag_name FROM tag t JOIN news2tag n2t ON n2t.tag_id = t.tag_id WHERE n2t.news_id = id LOOP

			arr[i] = temp.tag_name;

			i = i + 1;

		END LOOP;

		RETURN array_to_string(arr, ', ');

	END;

	$$ LANGUAGE 'plpgsql';

(inż. Piniol) #2

i int przyjmuje wartość null, w takim przypadku jak Twój w każdym języku programowania trzeba zdefiniować wartość początkową zmiennej.


(Airborn) #3

Niezadeklarowanie wartości początkowej było oczywiście głupim błędem, ale nie zgodzę się z tym, że w każdym języku jest analogicznie :wink: