Переменная, содержащая количество строк, затронутых предыдущим, УДАЛЯЕТ? (в функции)

У меня есть функция, которая используется в качестве триггера ВСТАВКИ. Эта функция удаляет строки, которые конфликтовали бы с [порядковый номер в] вставляемая строка. Это работает красиво, таким образом, я действительно не обсудил бы достоинства понятия.

DECLARE
re1 feeds_item.shareurl%TYPE;
BEGIN
SELECT regexp_replace(NEW.shareurl, '/[^/]+(-[0-9]+\.html)$','/[^/]+\\1') INTO re1;
RAISE NOTICE 'DELETEing rows from feeds_item where shareurl ~ ''%''', re1;

DELETE FROM feeds_item where shareurl ~ re1;
RETURN NEW;
END;

Я хотел бы добавить к УВЕДОМЛЕНИЮ признак того, сколько строк затронуто (иначе: удаленный). Как я могу сделать это (использование ЯЗЫКА 'plpgsql')?

ОБНОВЛЕНИЕ: Основа на некотором превосходном руководстве от "Курицы в кухне", я изменил его на это:

DECLARE
re1 feeds_item.shareurl%TYPE;
num_rows int;
BEGIN
SELECT regexp_replace(NEW.shareurl, '/[^/]+(-[0-9]+\.html)$','/[^/]+\\1') INTO re1;

DELETE FROM feeds_item where shareurl ~ re1;
IF FOUND THEN
    GET DIAGNOSTICS num_rows = ROW_COUNT;
    RAISE NOTICE 'DELETEd % row(s) from feeds_item where shareurl ~ ''%''', num_rows, re1;
END IF;
RETURN NEW;
END;
19
задан Bruno Bronosky 25 June 2010 в 12:28
поделиться

1 ответ

В Oracle PL / SQL системная переменная для хранения количества удаленных / вставленных / обновленных строк:

SQL%ROWCOUNT

После оператора DELETE / INSERT / UPDATE и ПЕРЕД ЗАДАНИЕМ вы можете сохранить SQL% ROWCOUNT в переменной типа NUMBER. Помните, что COMMIT или ROLLBACK сбрасывают значение SQL% ROWCOUNT на НУЛЬ, поэтому вам нужно скопировать значение SQL% ROWCOUNT в переменную ПЕРЕД COMMIT или ROLLBACK.

Пример:

BEGIN
   DECLARE
      affected_rows   NUMBER DEFAULT 0;
   BEGIN
      DELETE FROM feeds_item
            WHERE shareurl = re1;

      affected_rows := SQL%ROWCOUNT;
      DBMS_OUTPUT.
       put_line (
            'This DELETE would affect '
         || affected_rows
         || ' records in FEEDS_ITEM table.');
      ROLLBACK;
   END;
END;

Я также нашел это интересное РЕШЕНИЕ (источник: http://markmail.org/message/grqap2pncqd6w3sp )

7 апреля 2007 года Картикеян Сундарам написал:

Привет,

 Я использую 8.1.0 postgres и пытаюсь написать блок plpgsql. В этом я вставляю строку. Я хочу проверить, была ли строка

вставлены или нет.

В оракуле мы можем сказать так

 начало
вставить в значения table_a (1);
если sql% rowcount> 0
тогда
dbms.output.put_line ('вставленные строки');
еще
dbms.output.put_line ('строки не вставлены');
конец, если; конец;

Есть ли в postgres что-то равное sql% rowcount? Пожалуйста помоги.

С уважением, скарти

Может быть:

http://www.postgresql.org/docs/8.2/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW

Щелкните ссылку выше , вы увидите это содержание:

37.6.6. Получение статуса результата Есть несколько способов определить эффект команды.Первый метод - использовать GET Команда DIAGNOSTICS, имеющая вид:

GET DIAGNOSTICS variable = item [, ...]; Эта команда позволяет поиск индикаторов состояния системы. Каждый предмет - ключевое слово определение значения состояния, которое будет присвоено указанной переменной (который должен иметь правильный тип данных для его получения). В настоящее время доступные элементы статуса: ROW_COUNT, количество строк, обработанных последняя команда SQL, отправленная механизму SQL, и RESULT_OID, OID последней строки, вставленной самой последней командой SQL. Обратите внимание, что RESULT_OID полезен только после команды INSERT в таблицу содержащие OID.

Пример:

ПОЛУЧИТЬ ДИАГНОСТИКУ integer_var = ROW_COUNT; Второй способ определить эффекты команды - это проверить специальную переменную с именем FOUND, который имеет логический тип. НАЙДЕНО начинается ложным внутри каждый вызов функции PL / pgSQL. Устанавливается каждым из следующих типов of операторов:

Оператор SELECT INTO устанавливает FOUND истину, если строка назначена, и ложь, если ни одна строка не возвращается.

Оператор PERFORM устанавливает значение FOUND в истинное значение, если оно создает (и отбрасывает) row, false, если строка не создается.

Операторы UPDATE, INSERT и DELETE устанавливают FOUND как истину, если хотя бы один строка затронута, ложь, если никакая строка не затронута.

Оператор FETCH устанавливает для FOUND истину, если она возвращает строку, и ложь, если строки нет. возвращается.

Оператор FOR устанавливает значение FOUND в истинное значение, если выполняется итерация один или несколько раз, иначе ложный. Это относится ко всем трем вариантам оператора FOR. (целочисленные циклы FOR, циклы FOR с набором записей и динамический набор записей FOR петли).FOUND устанавливается таким образом при выходе из цикла FOR; внутри выполнение цикла, FOUND не изменяется оператором FOR, хотя он может быть изменен выполнением других операторов в пределах тело цикла.

FOUND - это локальная переменная в каждой функции PL / pgSQL; любые изменения на него влияет только текущая функция.

11
ответ дан 30 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: