2015-02-03 4 views
1

Я хочу использовать DBLink в PL/PgSQL хранимой процедуры таким образом:Postgres DBLink вызов хранимой процедуры с указанием уровня транзакций

PERFORM dblink_exec('myconn', 'BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE'); 
PERFORM dblink_exec('myconn', 'SELECT another_stored_procedure()'); 
PERFORM dblink_exec('myconn', 'COMMIT'); 

, но я получил сообщение об ошибке во время выполнения:

ERROR: statement returning results not allowed 
CONTEXT: SQL statement "SELECT dblink_exec('myconn', 'select another_stored_procedure()')" 

так выполнение не выполняется, хотя я пытался получить желаемый результат по-разному.

UPDATE 1:

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

Дело в том, что уровень транзакций по умолчанию на моем сервере «прочитан», но иногда мне нужно начинать транзакции с другого уровня, например. «Сериализация».

Поэтому мне нужно выполнить хранимую процедуру в автономной транзакции с явным указанием уровня транзакции.

И насколько я знаю, dblink позволяет это, но мне не удалось найти полезную информацию о функциях dblink или dblink_exec, которые подходят для моей ситуации.

+0

У вас есть другой сервер PostgreSQL на другом конце? – pozs

+0

@pozs См. Обновление 1 PLS – FrozenHeart

ответ

2

Предполагается, что вы подключились к другому серверу PostgreSQL на другом конце.

Для выполнения операторов, которые имеют результат (ы), а не dblink_exec(), необходимо вызвать функцию dblink(). (Даже если ваша функция на другом конце имеет returns void - в этом случае, вы можете получить один NULL от вызова этой функции в SELECT.)

Кроме того, вы может не нужно управление транзакциями:

Короче говоря, вам нужно выполнить:

-- PERFORM dblink_exec('myconn', 'BEGIN ...'); 
-- if you need explicit transaction management 
PERFORM * FROM dblink('myconn', 'SELECT another_stored_procedure()') alias(col text); 
-- PERFORM dblink_exec('myconn', 'COMMIT'); 
+0

См. Обновление 1 PLS – FrozenHeart

+1

@FrozenHeart, что не имеет значения (вот почему я написал, что вам может не понадобиться управление транзакциями). Как я уже сказал, вы должны использовать 'dblink()' для оператора SELECT'. Вы еще пробовали? – pozs

+1

Спасибо за прицеливание. Ваш вариант не сработал с: 'ERROR: заявление, возвращающее результаты, не разрешено', но это работает для меня (my another_stored_procedure() возвращает void):' PERFORM * FROM dblink ('myconn', 'SELECT another_stored_procedure()') в качестве t1 (тестовый текст); ' – FrozenHeart

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

  • Нет связанных вопросов^_^