Использовать переменную из предыдущего предложения DO - PullRequest
0 голосов
/ 16 мая 2018

У меня есть скрипт .sql, подобный этому:

DO $$
    DECLARE     
    prev_count := (SELECT count(*) FROM ...);
END$$;

UPDATE [...]

DO $$
    DECLARE     
    cur_count := (SELECT count(*) FROM ...);
    BEGIN
    ASSERT cur_count = prev_count, 'Mismatch';
END$$;

, в котором я получаю некоторое значение, изменяю базу данных и ожидаю, что новое значение будет соответствовать старому значению.Однако я получаю такие ошибки:

psql:migration.sql:163: ERROR:  column "prev_count" does not exist
LINE 1: SELECT cur_count = prev_count
                              ^
QUERY:  SELECT cur_count = prev_count
CONTEXT:  PL/pgSQL function inline_code_block line 4 at ASSERT

Я не могу сказать, является ли это проблемой ограничения из-за анонимного блока и почему он пытается обработать мои переменные как столбцы.Есть идеи?

1 Ответ

0 голосов
/ 16 мая 2018

Согласно инструкции DO выполняет блок анонимного кода, который:

... обрабатывается так, как если бы это было тело функции без параметров, возвращая void. Он анализируется и выполняется один раз ...

Так что это функция, которая возвращает VOID. В этом смысле prev_count существует только в первом DO.

Чтобы избежать этого, вы можете создать таблицу TEMP и вставить prev_count в первый DO, чтобы вы могли использовать его в любом месте транзакции.

...