В postgresql возвращает результат функции в правиле при выполнении INSERT INTO RETURNING - PullRequest
4 голосов
/ 24 мая 2010

У меня есть представление с несколькими полями.

Когда я INSERT INTO представление, я запускаю функцию, основанную на параметрах INSERT.Функция возвращает значение.

Как получить значение из правила?

INSERT RETURNING Дает мне:

ОШИБКА: не удается выполнить ВСТАВКУ ВОЗВРАТА для отношения"full_subntes"
СОВЕТ: Вам необходимо безусловное правило ON INSERT DO INSTEAD с предложением RETURNING.

Пример:

CREATE TABLE test (
    a VARCAHR primary key,
    b VARCHAR,
);

CREATE VIEW test_v AS SELECT * FROM test;

CREATE OR REPLACE RULE Test_v_Insert AS ON INSERT TO Test_v
DO INSTEAD (
    SELECT myFunction('param');
);

INSERT INTO test_v(a, b) VALUES ('a', 'b') RETURNING a, b;

Тогда я получаю ошибку, описанную выше.

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

Вот пример.

Сначала мы создаем тестовую таблицу:

CREATE TABLE test (a integer, b varchar, primary key (a));

Затем мы создаем представление:

CREATE OR REPLACE VIEW test_view AS SELECT * FROM test;

Далее создается правило обновления:

CREATE OR REPLACE RULE rl_test_view_update AS
    ON UPDATE TO test_view DO INSTEAD
    UPDATE test SET a = NEW.a, b = NEW.b
    WHERE test.a = old.a AND test.b = old.b;

И, наконец, вот правило вставки:

CREATE OR REPLACE RULE rl_test_view_insert AS
    ON INSERT TO test_view DO INSTEAD
    INSERT INTO test VALUES (NEW.a, NEW.b)
    RETURNING test.*;

Теперь вы можете вставить некоторые тестовые данные:

INSERT INTO test_view (a, b) VALUES (1,'John Doe') RETURNING a;

и проверьте вставленные кортежи:

SELECT * FROM test_view;
0 голосов
/ 24 мая 2010

Чтобы обновить представление в Postgres, вам нужно определить правило, сообщающее ему об обновлении базовой таблицы. Не похоже, что вы создали правило. http://www.postgresql.org/docs/current/interactive/rules-update.html

...