2012-04-16 2 views
4

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

Так что мой вопрос:

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

В Oracle решение будет иметь 4 шага:

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

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

ответ

1

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

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

7

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

Ключ заявление вам нужно:

GET DIAGNOSTICS integer_var = ROW_COUNT; 

Details in the manual.

Пример кода:

CREATE OR REPLACE FUNCTION f_up_some() 
    RETURNS integer AS 
$BODY$ 
DECLARE 
ct int := 0; -- initialize 
i int; 
BEGIN 

EXECUTE 'UPDATE tbl1 ...'; -- something is dynamic here 

GET DIAGNOSTICS i = ROW_COUNT; 
ct := ct + i; 

UPDATE tbl2 ...;   -- nothing really dynamic here 

GET DIAGNOSTICS i = ROW_COUNT; 
ct := ct + i; 

RETURN ct; 

END; 
$BODY$ 
    LANGUAGE plpgsql; 

Вызов:

SELECT * FROM f_up_some(); 
+0

Большое спасибо за ваш ответ – Yavanosta

Смежные вопросы