Вычислить количество строк, затронутых пакетным запросом в PostgreSQL

Прежде всего, да, я читал документацию для оператора DO :) http://www.postgresql.org/docs/9.1/static/sql-do.html

Итак, мой вопрос:

Мне нужно выполнить некоторый динамический блок кода, содержащий операторы UPDATE, и вычислить количество всех затронутых строк. Я использую Ado.Net провайдера.

В Oracle решение будет состоять из 4 шагов:

  1. добавить в команду параметр InputOutput "N"
  2. добавить BEGIN ... END; в команду
  3. добавляйте : N: =: N + sql% rowcount после каждого оператора.
  4. Это сделано! Мы можем прочитать параметр N из команды после ее выполнения.

Как я могу это сделать с PostgreSQL? Я использую провайдер npgsql, но могу перейти на devard, если это поможет.


person Yavanosta    schedule 16.04.2012    source источник


Ответы (2)


DO блоки операторов подходят для выполнения динамического SQL. Они не годятся для возврата значений. Используйте plpgsql функция для этого.

Ключевое утверждение, которое вам нужно:

GET DIAGNOSTICS integer_var = ROW_COUNT;

Подробности в руководстве.

Пример кода:

CREATE OR REPLACE FUNCTION f_upd_some()
  RETURNS integer AS
$func$
DECLARE
   ct int;
   i  int;
BEGIN
   EXECUTE 'UPDATE tbl1 ...';       -- something dynamic here
   GET DIAGNOSTICS ct = ROW_COUNT;  -- initialize with 1st count

   UPDATE tbl2 ...;                 -- nothing dynamic here 
   GET DIAGNOSTICS i = ROW_COUNT;
   ct := ct + i;                    -- add up

   RETURN ct;
END
$func$  LANGUAGE plpgsql;

Вызов:

SELECT * FROM f_upd_some();
person Erwin Brandstetter    schedule 16.04.2012

Мое решение довольно простое. В Oracle мне нужно использовать переменные для вычисления суммы обновленных строк, потому что command.ExecuteNonQuery() возвращает только количество строк, затронутых последним UPDATE в пакете.

Однако npgsql возвращает сумму всех строк, обновленных всеми запросами UPDATE. Поэтому мне нужно только вызвать command.ExecuteNonQuery() и получить результат без каких-либо переменных. Намного проще, чем с Oracle.

person Yavanosta    schedule 17.04.2012