To pytanie było wielokrotnie zadawane here i here, ale żadna z odpowiedzi nie jest odpowiednia w moim przypadku, ponieważ nie chcę wykonywać mojej aktualizacji w funkcji PL/PgSQL i używać GET DIAGNOSTICS integer_var = ROW_COUNT
.Powiązanie wierszy za pomocą instrukcji UPDATE w RAW plpgsql
Muszę to zrobić w surowym SQL.
Na przykład w MS SQL Server mamy @@ ROWCOUNT, które mogą być używane jak poniżej:
UPDATE <target_table>
SET Proprerty0 = Value0
WHERE <predicate>;
SELECT <computed_value_columns>
FROM <target>
WHERE @@ROWCOUNT > 0;
W jednym obie strony do bazy wiem, czy aktualizacja powiodła się i obliczone wartości z powrotem .
Co można użyć zamiast "@@ ROWCOUNT"? Czy ktoś może potwierdzić, że jest to obecnie niemożliwe?
Z góry dziękuję.
EDIT 1: Potwierdzam, że muszę używać surowego kodu SQL (napisałem "surowy plpgsql" w oryginalnym opisie).
W celu uczynienia moje pytanie jaśniejsze proszę pod uwagę, że oświadczenie aktualizacja dotyczy tylko jeden wiersz i myśleć o optymistycznej współbieżności:
Klient zrobił oświadczenie
SELECT
na początku.Buduje UPDATE i wie, które kolumny obliczeniowe bazy danych mają zostać włączone do klauzuli SELECT. Między innymi predykat zawiera znacznik czasu, który jest obliczany za każdym razem, gdy wiersze są aktualizowane.
Tak więc, jeśli mamy 1 wiersz zwrócony, wszystko jest w porządku. Jeśli nie zostanie zwrócony żaden wiersz, wiemy, że była poprzednia aktualizacja i klient może potrzebować odświeżyć dane przed ponowną próbą aktualizacji klauzuli. Dlatego musimy znać liczbę wierszy, na które wpływa instrukcja aktualizacji, przed zwróceniem kolumn obliczeniowych. W przypadku niepowodzenia aktualizacji nie należy zwracać wiersza.
W pytaniach zawsze należy podać swoją wersję PostgreSQL. –
Więc ** nie ** chcesz robić w PL/pgSQL, ale w SQL. W przeciwnym razie możesz * użyć * GET DIAGNOSTICS ' –
@CraigRinger: Zobacz odpowiedni znacznik. –