Вопросы по SQL и другие аспекты работы PostgreSQL

warning: Creating default object from empty value in /var/www/victor/web/pgdocs.ru/data/modules/taxonomy/taxonomy.pages.inc on line 33.
Здесь обсуждаются запросы на SQL в PostgreSQL. Оптимизация запросов, реализация, подходы и т.д.

Postgresql и xml. Как найти в базе данных запись, в которой присутствует указанный xml-тег

Есть таблица в базе данных. В таблице есть поле data типа xml. В базе множество записей, с разными xml документами(хранящимися в data). Как выбрать все записи, в которых присутствует только нужный тег, например: title

Мне надо что-то типа:
SELECT data FROM table WHERE data ilike "%title%" -конечно, это чушь, но может будет понятнее, что нужно.

возможен ли возврат управления триггеру

Добрый день.
На таблицу test_1 навешан триггер 'BEFORE DELETE on test1 FOR EACH ROW'.
Триггерная функция вызывает удаление строки из таблицы test_2, на которой тоже висит триггер 'AFTER DELETE on test_2 FOR EACH ROW'.
Предполагалось, что после отработки второго триггера, управление вернется первому. Но нет, все заканчивается удалением из test_2.
Подскажите, есть ли решение. Пожалуйста

UDF PostgreSQL и php

Добрый день.
На удаленном сервере Postgre есть пользовательская функция, которую нужно вызвать из веб-приложения на php.

Вызов вида

Код:

$переменная='значение_переменной';
$sql="SELECT * FROM функция_на_сервере($переменная);";
$res=pg_query($db,$sql);

не проходит
приходит ошибка: column "значение_переменной" does not exist

Как мне кажется, на сервере при подстановке получается что-то такое:

Код:
SELECT что_то FROM откуда_то WHERE значение_столбца=значение_переменной;

а должно быть так:

Код:

Исключение новой записи из SELECT

Доброго времени суток!!!

Есть триггерная функция. В ней выполняется SELECT. Как исключить новую запись из запроса??? То есть, я создаю новую запись или же обновляю старую, после чего триггер выбирает уже имеющиеся записи и сравнивает. Но он собстно выбирает все вместе с новой записью(логично т.к. триггер AFTER)

з.ы. Представить код сейчас нет возможности. Заранее спасибо!!!

Вопрос по EXCEPTION

у меня есть ряд запросов, выполняющихся как
DO LANGUAGE plpgsql $$
begin
--запросы
END
commit;
$$;

В частности, внутри подготавливаются prepared функции.
Если функции уже созданы, то запрос вылетает с исключением. Для меня это очень печально. Перехватывать это исключение в программе не вариант.
Пытался вставить перед коммитом EXCEPTION WHEN duplicate_prepared_statement THEN
но postgre все равно ругается на commit;
ERROR: SPI_execute_plan_with_paramlist failed executing query "commit": SPI_ERROR_TRANSACTION
подскажите, что делать?

Подстановка имени поля в триггере

Задача: написать триггер который будет вести лог изменении данных таблицы.
Нюанс: триггер должен работать независимо от изменения структуры таблицы.
Пример:
В таблице три поля- имя, фамилия, отчество. При вставке записи триггер пишет в лог 3 записи
(имя поля) (значение)
1.имя иван
2.фамилия иванов
3.отчество иванович

INTEGER - NUMERIC - VARCHAR

Д.д! Народ, копирую данные из Oracle в Pg. Хотел бы уточнить являются ли фактически идентичными типы полей NUMERIC(8,0) и INTEGER? Или есть принципиальные различия в хранении (больше/меньше памяти) или скорости доступа...

И ещё... VARCHAR(10) и NUMERIC(10,0) для поля в котором хранится числовое значение (идентификационный код) над которым не будут производиться арифметические операции - что предпочтительнее?

Почему не работает запрос

Делаю запрос к БД

SELECT COALESCE(CAST(SUM(CASE WHEN flg_f_cbet THEN 1 ELSE 0 END) AS real)
/ NULLIF(SUM(CASE WHEN flg_f_cbet_opp THEN 1 ELSE 0 END), 0), -1)
AS result
FROM holdem_hand_player_statistics AS PS
HAVING COALESCE(CAST(SUM(CASE WHEN PS.cnt_p_raise > 0 THEN 1 ELSE 0 END) AS real)
/ NULLIF(SUM(CASE WHEN PS.id_hand > 0 THEN 1 ELSE 0 END), 0), -1) < 10

почему то запрос полностью игнорирует все что идет после HAVING как буд то там нет никакого условия

то есть что с ним что без него результат один

пользовательские переменные в postgresql

Здравствуйте!

В mysql есть возможность использовать пользовательские переменные в запросах, что позволяет оптимизировать определенные вычисления.

Простой пример - есть таблица pogoda с двумя полями - t и d, t - это временная метка, а d - это результат измерения погоды. Требуется найти максимальный перепад.

Срабатывает следующая конструкция:

Код:
SET @data=NULL, @next_data=NULL, @max_value=0;

SELECT @next_data:=`d` `nextdata`,IF (@next_data - @data>@max_value, @max_value:=@next_data-@data, @max_value), @data:=d FROM `pogoda`;

SELECT @max_value;

триггеры и триггерные функции

есть таблица ЗАКАЗЫ
CREATE TABLE ORDERS (
id SERIAL NOT NULL
, price INT
, discount INT
, id_customer INT
, order_date DATE
, is_pay BOOLEAN
, delivery_date DATE
, PRIMARY KEY (id)
);

И есть триггер на добавление и обновление в эту таблицу.


CREATE TRIGGER trigger2
AFTER INSERT OR UPDATE
ON orders
FOR EACH ROW
EXECUTE PROCEDURE func1();

В триггерной функции ORDERS.price устанавливается в 300.

CREATE OR REPLACE FUNCTION func1()
RETURNS trigger AS
$BODY$BEGIN
NEW.price=300;
END;$BODY$

Собранный материал

Back to top

(С) Виктор Вислобоков, 2008-2023