Zapytanie sql execute-immediate

0

Baza to Postgresql 9.6

Potrzebuję wyzwalacz które będzie aktualizować tabelę
Wyzwalacz już jest, niestety problemem są warunki w zapytaniu.

W tabeli do której podpięty jest wyzwalacz są pola numerkonta,kwotawn,kwotama przykłady wpisów pola numerkonta
'202-1'
'230-2'
'240-3-26'
Są to pola które mają swoje odpowiedniki w innej tabeli (plan z polami numerkonta,saldown,saldoma) i należy ten plan aktualizować (pola saldown,saldoma)
Wstępnie utworzyłem SQL (w funkcji wyzwalacza)

Przykłady

UPDATE plan_cialo SET saldown=0, saldoma=0 WHERE rok=2018 and numerkonta='202-1'  and numerkonta='202';  
UPDATE plan_cialo SET saldown=0, saldoma=0 WHERE rok=2018 and numerkonta='230-3'  and numerkonta='230';  
UPDATE plan_cialo SET saldown=0, saldoma=0 WHERE rok=2018 and numerkonta='240-3-26'  and numerkonta='240-3' and numerkonta='240';  

Niestety jak widać lista warunków jest zmienna
stworzyłem funkcję która zamienia ciąg '240-3-26' na 'and numerkonta='240-3-26' and numerkonta='240-3' and numerkonta='240''
ale niestety nie umiem wykonać tak przygotowanych warunków.

Pytanie jest następujące jak wykonać tą zmienną listę warunków w funkcji SQL?

Piszę w C# i nie ma problemu złożyć sql w C# ale wtedy wyzwalacz traci sens.

2

Numer konta NIE MOŻE być JEDNOCZEŚNIE i 240 i 240-3 i 240-3-26.
Użyj IN (co jst odpowiednikiem OR dla poszczególnych elementów)WHERE rok=2018 AND numerkonta IN ('240', '240-3', '240-3-26')

0

^^^
Nie zrozumiałeś mnie.
To są kolejne wpisy.
Ogólnie to jest pomyślane jako struktura drzewiasta i chcę ją przeliczyć

202 -> 202-1
-> 202-2
...
-> 202-X
-> 202-X

i tak dalej o różnym stopniu zagłębienia

1

@karol75: Nie zrozumiałeś mnie. Przeczytaj uważnie jeszcze raz pierwsze zdanie.

1

@karol75: W czym problem? Jeśli nie wiesz jak działają triggery: https://www.postgresql.org/docs/9.6/static/sql-createtrigger.html

Jeśli zmianie ulega jakiś "wiersz", to dla wyzwalacza nie są istotne warunki z klauzuli WHERE, która pojawiła się w UPDATE. Wyzwalacz może wywołać logikę dla każdego "wiersza" (FOR EACH ROW) i mieć dostęp do informacji o wartościach modyfikowanego "wiersza" (stan przed zmianą i po zmianie: NEW.atrybut1 / OLD.atrybut1).

0
yarel napisał(a):

@karol75: W czym problem? Jeśli nie wiesz jak działają triggery: https://www.postgresql.org/docs/9.6/static/sql-createtrigger.html

W funkcji wyzwalacza jest polecenie sql która ma się zachowywać jak napisałem.

0
Marcin.Miga napisał(a):

@karol75: Nie zrozumiałeś mnie. Przeczytaj uważnie jeszcze raz pierwsze zdanie.

Pozostaje nadal problem jak dodać listę wpisów do podzapytania w funkcji wyzwalacza.

0
karol75 napisał(a):
Marcin.Miga napisał(a):

@karol75: Nie zrozumiałeś mnie. Przeczytaj uważnie jeszcze raz pierwsze zdanie.

Pozostaje nadal problem jak dodać listę wpisów do podzapytania w funkcji wyzwalacza.

Ja nie wiem co wpływa na wybranie warunków, ale w najgorszym przypadku masz możliwość dynamicznego zbudowania treści SQLa i wywołania takowego:
https://www.postgresql.org/docs/9.6/static/ecpg-sql-execute-immediate.html

0

Dokładnie o to mi chodziło. Dzięki.

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