<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Problem z językiem plpgsql.]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=192&amp;type=atom"/>
	<updated>2009-04-29T02:15:36Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=192</id>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=782#p782"/>
			<content type="html"><![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ł ;)]]></content>
			<author>
				<name><![CDATA[Sajrox]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=891</uri>
			</author>
			<updated>2009-04-29T02:15:36Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=782#p782</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=781#p781"/>
			<content type="html"><![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ś.]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-04-28T20:47:39Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=781#p781</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=773#p773"/>
			<content type="html"><![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 :)]]></content>
			<author>
				<name><![CDATA[Sajrox]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=891</uri>
			</author>
			<updated>2009-04-28T09:57:30Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=773#p773</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=772#p772"/>
			<content type="html"><![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 ':='.]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-04-28T06:10:55Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=772#p772</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=771#p771"/>
			<content type="html"><![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]]]></content>
			<author>
				<name><![CDATA[Sajrox]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=891</uri>
			</author>
			<updated>2009-04-27T22:09:14Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=771#p771</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=770#p770"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-04-27T16:44:07Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=770#p770</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=769#p769"/>
			<content type="html"><![CDATA[Nie jestem pewny:), ale może spróbuj takiego zapisu  '{1,2,3}'.]]></content>
			<author>
				<name><![CDATA[woziu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=64</uri>
			</author>
			<updated>2009-04-27T16:17:59Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=769#p769</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=768#p768"/>
			<content type="html"><![CDATA[Możesz przedstawić to całą funkcję, od 'create function' do końca.]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-04-27T13:56:49Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=768#p768</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=765#p765"/>
			<content type="html"><![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 :/]]></content>
			<author>
				<name><![CDATA[Sajrox]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=891</uri>
			</author>
			<updated>2009-04-27T11:41:06Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=765#p765</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=763#p763"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-04-27T07:11:16Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=763#p763</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Problem z językiem plpgsql.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=761#p761"/>
			<content type="html"><![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 :)]]></content>
			<author>
				<name><![CDATA[Sajrox]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=891</uri>
			</author>
			<updated>2009-04-26T20:03:43Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=761#p761</id>
		</entry>
</feed>
