<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Problem z językiem plpgsql.]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=192</link>
		<description><![CDATA[Najświeższe odpowiedzi w Problem z językiem plpgsql..]]></description>
		<lastBuildDate>Wed, 29 Apr 2009 02:15:36 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=782#p782</link>
			<description><![CDATA[Udał się :)
Troche musiałem jeszcze pokombinować ale wkońcu działa. Pomocne było tutaj słowo EXECUTE oraz '|| ||'
Po prostu brakuje mi podstaw z tej dziedziny :/

Oto moj kod może się komuś przyda:
[code]
DECLARE

kategorie_id_new integer;
moje_drzewo_id text;

BEGIN

IF (TG_OP = 'DELETE') THEN

kategorie_id_new = OLD."kategorie_id";

ELSE

kategorie_id_new = NEW."kategorie_id";

END IF;

SELECT drzewo_id INTO moje_drzewo_id FROM kategorie WHERE id = kategorie_id_new;

EXECUTE 'UPDATE kategorie SET wszystkich_produktow = (SELECT count(*) FROM produkty WHERE kategorie_id IN ('||moje_drzewo_id||')) WHERE id = ('||kategorie_id_new||')';

RETURN NEW;

END; 
[/code]

Dzięki wielkie za pomoc !! Na pewno będę tu często zaglądał ;)]]></description>
			<author><![CDATA[dummy@example.com (Sajrox)]]></author>
			<pubDate>Wed, 29 Apr 2009 02:15:36 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=782#p782</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=781#p781</link>
			<description><![CDATA[No dobra to moze spróbuj zapytaniem dynamiczym. Coś w stylu
[code]
moje_id = '1,2,3,4';
EXECUTE 'UPDATE kategorie SET wszystkich_produktow = (SELECT count(*) FROM produkty WHERE kategorie_id IN      
                ('||moje_id||')) WHERE id = kategorie_id_new';
[/code]

Powinno zadziałać. To chyba to co chciałeś.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 28 Apr 2009 20:47:39 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=781#p781</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=773#p773</link>
			<description><![CDATA[No właśnie wkleiłem całą funkcje :)

Podaje jeszcze raz to co uzyskałem przez Export:
[code]
CREATE FUNCTION liczba_ofert() RETURNS trigger
    AS $$DECLARE

my_id int;

BEGIN

IF (TG_OP = 'DELETE') THEN

my_id = OLD.produkty_id;

ELSE

my_id = NEW.produkty_id;

END IF;

UPDATE produkty SET wszystkich_ofert = (SELECT count(*) FROM oferty WHERE produkty_id = my_id AND czy_aktywna = true) WHERE id = my_id;
UPDATE produkty SET cena_min = (SELECT cena FROM oferty WHERE produkty_id = my_id AND czy_aktywna = true ORDER BY cena ASC LIMIT 1) WHERE id = my_id;
UPDATE produkty SET cena_max = (SELECT cena FROM oferty WHERE produkty_id = my_id AND czy_aktywna = true ORDER BY cena DESC LIMIT 1) WHERE id = my_id;


IF(TG_OP <> 'DELETE') THEN

RETURN NEW;

ELSE

RETURN OLD;

END IF;    

END;$$
    LANGUAGE plpgsql;
[/code]

i wsio :)]]></description>
			<author><![CDATA[dummy@example.com (Sajrox)]]></author>
			<pubDate>Tue, 28 Apr 2009 09:57:30 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=773#p773</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=772#p772</link>
			<description><![CDATA[Nie no bez jaj :), co to niby ma oznaczać
[code]
moje_id = 1,2,3,4;
[/code]
Prosiłem o całą funkcję od 'CREATE FUNCTION' ale się nie zrozumieliśmy. Powiedz mi w jaki sposób ograniczasz ciało funkcji. 
Czyli zazwyczaj definicja funkcji wygląda tak
[code]
create function nazwa(argumenty) returns typ_zwracany as ...
[/code]
i w miejscu  '...' pojawia się separator. Jakiego ty użyłeś?
Acha i tak na końcu to w plpgsql przypisanie zapisuje się operatorem ':='.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 28 Apr 2009 06:10:55 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=772#p772</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=771#p771</link>
			<description><![CDATA[Podaje całą funkcje:

[code]
DECLARE
      kategorie_id_new integer;
      moje_id  integer;
BEGIN

IF (TG_OP = 'DELETE') THEN
      kategorie_id_new = OLD."kategorie_id";
ELSE
      kategorie_id_new = NEW."kategorie_id";
END IF;

moje_id = 1,2,3,4;


UPDATE kategorie SET wszystkich_produktow = (SELECT count(*) FROM produkty WHERE kategorie_id IN (moje_id)) WHERE id = kategorie_id_new;

RETURN NEW;
END; 
[/code]

Przypisuje ją do tabeli jako trigger i po dodania do tej tabeli rekordu funkcja powinna się uruchomić i prawidłowo wszystko policzyć. Jednak dostaje błąd:
[code]
ERROR:  query "SELECT  1,2,3,4" returned 4 columns
CONTEXT:  PL/pgSQL function "liczba_produktow" line 18 at assignment
[/code]


Generalnie jak ręcznie wpisze  IN(1,2,3,4)  to działa. Jednak gdy w IN(moja_zmienna)  podam zmienna to jest problem. 

Czemu się tak dzieje ? Może źle przypisuje ten ciąg do zmiennej.
Dodam że gdy zmienna moje_id jest typu text i wartość przypisuje do niej tak:
[code]
moje_id = '1,2,3,4';
[/code]

Także nie działa :(
[code]
ERROR:  operator does not exist: integer = text
LINE 1: ...(SELECT count(*) FROM produkty WHERE kategorie_id IN ( $1 ))...
[/code]]]></description>
			<author><![CDATA[dummy@example.com (Sajrox)]]></author>
			<pubDate>Mon, 27 Apr 2009 22:09:14 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=771#p771</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=770#p770</link>
			<description><![CDATA[Nie no nie ma co kombinować.
Nie możesz napisac
[code]
kategorie_id IN ('1,2,3')
[/code]
bo prawdopodobnie kategorie_id jest typu integer a '1,2,3' to napis. Juz lepiej napisać
[code]
kategorie_id IN (1,2,3)
[/code]
Jak pokaże całą funkcję w szczególności separator ciała to będzie można spróbować z dynamicznym sqlem.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Mon, 27 Apr 2009 16:44:07 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=770#p770</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=769#p769</link>
			<description><![CDATA[Nie jestem pewny:), ale może spróbuj takiego zapisu  '{1,2,3}'.]]></description>
			<author><![CDATA[dummy@example.com (woziu)]]></author>
			<pubDate>Mon, 27 Apr 2009 16:17:59 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=769#p769</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=768#p768</link>
			<description><![CDATA[Możesz przedstawić to całą funkcję, od 'create function' do końca.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Mon, 27 Apr 2009 13:56:49 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=768#p768</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=765#p765</link>
			<description><![CDATA[Próbuje coś takiego:
[code]UPDATE kategorie as c SET c.wszystkich_produktow = (SELECT count(*) FROM produkty WHERE kategorie_id IN (c.drzewo_id::text)) WHERE c.id = "kategorie_id_new";[/code]

Jednak otrzymuje błąd:

[code]BŁĄD:  operator nie istnieje: integer = text[/code]

Np gdy wstawie coś takiego:

[code]UPDATE kategorie as c SET c.wszystkich_produktow = (SELECT count(*) FROM produkty WHERE kategorie_id IN ('1,2,3')) WHERE c.id = "kategorie_id_new";[/code]

To mimo tego otrzymuje ten sam błąd jakby nie akceptował typ danych "text"

Jest na to jakaś rada ? PO prostu problem jest z tym że w IN () jak daje ciag '1,2,3' lub 1,2,3 (bez cudzysłowów)
to otrzymuje bląd
[code]BŁĄD:  operator nie istnieje: integer = text[/code]
tak jakby po IN można było dać tylko typ integer co jest troche dziwne :/]]></description>
			<author><![CDATA[dummy@example.com (Sajrox)]]></author>
			<pubDate>Mon, 27 Apr 2009 11:41:06 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=765#p765</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=763#p763</link>
			<description><![CDATA[W postgresie jak uzyjesz " to baza traktuje zawartość jak nazwę kolumny/tabeli ogólnie jakiegoś obiektu w bazie. Spróbuj użyć ' aby zdefiniować ciąg.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Mon, 27 Apr 2009 07:11:16 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=763#p763</guid>
		</item>
		<item>
			<title><![CDATA[Problem z językiem plpgsql.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=761#p761</link>
			<description><![CDATA[Witam,

Probuje napisać pewną funkcję.

[code]
DECLARE

kategorie_id_new integer;
drzewo_id_new text;

BEGIN

IF (TG_OP = 'DELETE') THEN
kategorie_id_new = OLD."kategorie_id";
ELSE
kategorie_id_new = NEW."kategorie_id";
END IF;

drzewo_id_new := "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,1303,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,1351,1";
UPDATE kategorie as c SET wszystkich_produktow = (SELECT count(*) FROM produkty WHERE kategorie_id IN (drzewo_id_new)) WHERE id = kategorie_id_new;


RETURN NEW;
END; 
[/code]

General;nie chodzui o jedną rzecz. Czemu nie działa ten kawałek kodu [b]kategorie_id IN (drzewo_id_new)[/b]
Gdy zamiast zmiennej drzewo_id_new wstawie ciąg liczb to wszystko jest ok ale gdy chce ten ciąg przypisać do zmiennej i nastepnie podaje tą zmienną jak powyżej to dostaje błąd przy użyciu tej funkcji:

[code]
BŁĄD:  kolumna "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,1303,23," nie istnieje
LINE 1: SELECT  "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21...
                ^
QUERY:  SELECT  "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,1303,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,1351,1"
CONTEXT:  PL/pgSQL function "liczba_produktow" line 14 at assignment

W poleceniu:
UPDATE "public"."produkty" SET "id"='401384', "nazwa"='ELSEVE Odżywka bez Spłukiwania 150 ml Nutrileum Intensywne Wygładzanie', "cena_min"=NULL, "cena_max"=NULL, "wszystkich_ofert"='0', "data_dodania"='2009-04-24 01:39:06.812163', "sklepy_id"='249', "kategorie_id"='1' WHERE "id"='401384'
[/code]



Pewnie dla kogoś kto w tym siedzi to banał więc bardzo proszę o pomoc :)]]></description>
			<author><![CDATA[dummy@example.com (Sajrox)]]></author>
			<pubDate>Sun, 26 Apr 2009 20:03:43 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=761#p761</guid>
		</item>
	</channel>
</rss>
