У меня есть функция, которая используется в качестве триггера ВСТАВКИ. Эта функция удаляет строки, которые конфликтовали бы с [порядковый номер в] вставляемая строка. Это работает красиво, таким образом, я действительно не обсудил бы достоинства понятия.
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;
В 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; любые изменения на него влияет только текущая функция.