Изчислете броя на редовете, засегнати от групова заявка в 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() връща само броя на редовете, засегнати от последното АКТУАЛИЗИРАНЕ в пакета.

Въпреки това npgsql връща сумата от всички редове, актуализирани от всички заявки UPDATE. Така че трябва само да извикам command.ExecuteNonQuery() и да получа резултата без никакви променливи. Много по-лесно отколкото с Oracle.

person Yavanosta    schedule 17.04.2012