konto usunięte

Temat: Błąd a concat w triggerze w pl/pgsql

Witam!
Robię trigera w pl/pgsql. Triger ma za zadanie:
- gdy w tabeli tabelka1 pojawi się nowa wiadomość zwiększyć licznik w tebelce2 o 1 dla odpowiedniego wiersza
- jeśli miesiac_data_koncowa ma pozniejszy meisiac niz miesiac_data_poczatkowa to licznik ma byc zwiekszony rowniez dla kolejnych miesiecy
Prosze się nie zrażać, że w if jest inna konstrukcja niż w else if. Była taka sama ale n ie działałą więc zmieniam i patrzę co mi wyplówa php my admin
Na chwilę obecną jest to błąd:

ERROR: syntax error at or near "$1"
LINE 1: ...PDATE tabelka2 SET $1 := $1...
^
QUERY: UPDATE tabelka2 SET $1 := $1 + 1 WHERE data_zapytania = CONCAT(@ $2 ||'/'||@ $3 ) AND data_zainteresowania = CONCAT(@ $4 ||'/'||@ $5 ) IF ROWCOUNT() = 0 THEN INSERT INTO tabelka2 (miesiac_zapytania, miesiac_zainteresowania, $1 ) VALUES (CONCAT(@ $2 ||'/'||@ $3 ), CONCAT(@ $4 ||'/'||@i), 1) END IF
CONTEXT: SQL statement in PL/PgSQL function "akt_statystyki" near line 20

CREATE FUNCTION akt_aaa() RETURNS trigger AS $akt_aaa$

Bardzo prosze o pomoc bo siedze z tym już 3ci dzień :(

Oto kod triggera:


DECLARE
rok_data_poczatkowa VARCHAR := to_number(to_char(NEW.data_od, 'YYYY'), '9999');
miesiac_data_poczatkowa VARCHAR := to_number(to_char (NEW.data_od, 'MM'), '9999');
rok_data_koncowa VARCHAR := to_number(to_char (NEW.data_do, 'YYYY'), '9999');
miesiac_data_koncowa VARCHAR := to_number(to_char (NEW.data_do, 'MM'), '9999');
miesiac_data_pytania VARCHAR := to_number(to_char (NEW.data_kontaktu, 'MM'), '9999');
rok_data_pytania VARCHAR := to_number(to_char (NEW.data_kontaktu, 'YYYY'), '9999');
ilosc INTEGER;

BEGIN

IF rok_data_koncowa = rok_data_poczatkowa THEN
FOR miesiac_data_poczatkowa IN miesiac_data_poczatkowa..miesiac_data_koncowa LOOP
UPDATE tabelka2
SET ilosc := ilosc + 1
WHERE data_zapytania = CONCAT(@rok_data_pytania||'/'||@miesiac_data_pytania) AND data_zainteresowania = CONCAT(@rok_data_poczatkowa||'/'||@miesiac_data_poczatkowa)
IF ROWCOUNT() = 0 THEN
INSERT INTO tabelka2 (miesiac_zapytania, miesiac_zainteresowania, ilosc)
VALUES (CONCAT(@rok_data_pytania||'/'||@miesiac_data_pytania), CONCAT(@rok_data_poczatkowa||'/'||@i), 1)
END IF;
END LOOP;
END IF;

ELSE IF rok_data_koncowa > rok_data_poczatkowa THEN
FOR i = miesiac_data_poczatkowa IN i..12 LOOP
UPDATE tabelka2
SET ilosc := OLD.ilosc + 1
WHERE data_zapytania = CONCAT(@rok_data_pytania,'/',@miesiac_data_pytania) AND data_zainteresowania = CONCAT(@rok_data_poczatkowa,'/',@i)
IF ROWCOUNT() = 0 THEN
INSERT INTO tabelka2 (miesiac_zapytania, miesiac_zainteresowania, ilosc)
VALUES (CONCAT(@rok_data_pytania,'/',@miesiac_data_pytania), CONCAT(@rok_data_poczatkowa,'/',@i), 1)
END IF;
END LOOP;
FOR i = 1 IN i..miesiac_data_koncowa LOOP
UPDATE tabelka2
SET ilosc := OLD.ilosc + 1
WHERE data_zapytania = CONCAT(@rok_data_pytania,'/',@miesiac_data_pytania) AND data_zainteresowania = CONCAT(@rok_data_koncowa,'/',@i)
IF ROWCOUNT() = 0 THEN
INSERT INTO tabelka2 (miesiac_zapytania, miesiac_zainteresowania, ilosc)
VALUES (CONCAT(@rok_data_pytania,'/',@miesiac_data_pytania), 'CONCAT(@rok_data_koncowa,'/',@i), 1)
END IF;
END LOOP;

END IF;

RETURN NEW;
END;
$akt_statystyki$ LANGUAGE plpgsql;

CREATE TRIGGER akt_aaa BEFORE INSERT OR UPDATE ON tabelka1
FOR EACH ROW EXECUTE PROCEDURE akt_aaa();

konto usunięte

Temat: Błąd a concat w triggerze w pl/pgsql

Ech…

to po kolei:

1) Jak robisz UPDATE, to nie ma żadnego ":=", jest tylko tak:

UPDATE x SET a = 10, b = '20' WHERE c = 'd';


2) Jak robisz trigger w pl/pgsql, to możesz użyć ":=" do przypisywania wartości do zmiennych, ale możesz też użyć "=". Reasumując: używaj zawsze "=".

3) Skąd masz te znaczki "@"? To nie jest MSSQL, to jest PostgreSQL, baza, która ma np. wyrażenia regularne :) Do zmiennych odwołujesz się normalnie, bez "@" na początku.

4) Zamiast nieustannego

CONCAT(a,b,c)
możesz użyć operatora "||":

 a || b || c 


5) Tutaj jest dokumentacja, wszystko czego potrzebujesz: http://www.postgresql.org/docs/9.1/static/plpgsql.htmlSzymon G. edytował(a) ten post dnia 07.08.12 o godzinie 13:48

konto usunięte

Temat: Błąd a concat w triggerze w pl/pgsql

dziękuję za odpowiedź
Idąc tym torem zrobiłem coś takiego:

BEGIN
IF rok_data_koncowa = rok_data_poczatkowa THEN FOR i IN miesiac_data_poczatkowa..miesiac_data_koncowa LOOP
UPDATE tabelka2 SET ilosc = ilosc + 1 WHERE data_zapytania = rok_data_pytania ||'/'|| miesiac_data_pytania AND data_zainteresowania = rok_data_poczatkowa||'/'||i);

IF ROWCOUNT() = 0 THEN
INSERT INTO noc_wiadmosci_usytkownikow_statystyki4 (miesiac_zapytania, miesiac_zainteresowania, ilosc)
VALUES rok_data_pytania||'/'||miesiac_data_pytania, rok_data_poczatkowa||'/'||i), 1)
END IF;
END LOOP;

W takim wypadku nadal zwraca błąd:

ERROR: syntax error at or near "$1"
LINE 1: ...DATE tabelka2 SET $1 = $1 ...
^
QUERY: UPDATE tabelka2 SET $1 = $1 + 1 WHERE data_zapytania = $2 ||'/'|| $3 AND data_zainteresowania = $4 ||'/'|| $5 )
CONTEXT: SQL statement in PL/PgSQL function "akt_statystyki" near line 17

konto usunięte

Temat: Błąd a concat w triggerze w pl/pgsql

Nie możesz wprost jako zmiennej podać nazwy kolumny, to się jakoś inaczej robiło, daj mi poszukać i zedytuje.

@edit

http://www.postgresql.org/docs/8.3/static/plpgsql-stat...

tam masz Executing Dynamic CommandsPrzemek Czekaj edytował(a) ten post dnia 07.08.12 o godzinie 14:39

konto usunięte

Temat: Błąd a concat w triggerze w pl/pgsql

nie rozumiem jak tego użyć. Możesz mi napisać jak to powinno wyglądać na moi przykł\adzie? Chociaż cały pierwszy for to sobie to zanalizuję i zrobię resztę

konto usunięte

Temat: Błąd a concat w triggerze w pl/pgsql

Paweł Ciosmak:
nie rozumiem jak tego użyć. Możesz mi napisać jak to powinno wyglądać na moi przykł\adzie? Chociaż cały pierwszy for to sobie to zanalizuję i zrobię resztę


Używasz tego tak, że wykonujesz zapytanie, które masz w zmiennej:

query := 'UPDATE x SET a = 10 WHERE b = 20';
EXECUTE query;


albo robisz to tak:

EXECUTE 'UPDATE x SET a = 10 WHERE b = 20'; 


W ten sposób możesz zrobić sobie coś zapytanie z nazwą tabeli przekazaną przez parametr do funkcji:

EXECUTE 'UPDATE ' || table_name || ' SET a = 10 WHERE b = 20';  
Szymon G. edytował(a) ten post dnia 07.08.12 o godzinie 15:28

konto usunięte

Temat: Błąd a concat w triggerze w pl/pgsql

I jak, dałeś radę czy dalej się z tym męczysz? Jeżeli się z tym męczysz, to pokaż przynajmniej jak wygląda tabela, wrzuć to gdzieś np pastebin.com i tą procedurę też na pastebin.com bo tego tutaj się czytać nie da...

Następna dyskusja:

Szkolenia PL/pgSQL w bazie ...




Wyślij zaproszenie do