2014-01-12 4 views
3

Когда я ниже функции, возникает некоторые ошибки:Как выполнить пакетное компиляцию в plpgsql?

**ddddl=# select sssss(1,10); 
ERROR: cannot begin/end transactions in PL/pgSQL 
HINT: Use a BEGIN block with an EXCEPTION clause instead. 
CONTEXT: PL/pgSQL function sssss(integer,integer) line 8 at SQL statement** 

Вот мой пример кода.

CREATE OR REPLACE FUNCTION sssss(
IN c_1 int, 
IN f_i int 
) returns void as 
$$ 
    DECLARE t_c  INT; 
    BEGIN 
     t_c := f_i; 
     WHILE c_1 <= t_c 
      loop 
      IF MOD(c_1, 4) = 1 THEN 
       start transaction; 
      END IF; 
      -- My statements here. 
      IF MOD(c_1, 4) = 0 THEN 
       COMMIT; 
      END IF; 
      c_1 := c_1 + 1; 
     END loop; 
     COMMIT; 
    END; 
$$ language plpgsql; 

Так может ли кто-нибудь дать мне образец того, как закончить работу, как приведенный выше код?

Я использую PostgreSQL 9.2.

+2

Какую проблему вы пытаетесь решить с этим дозированием? Если вы пытаетесь повысить производительность, тогда вы, как правило, должны перефразировать все, чтобы не полагаться на PLOP/PgSQL 'LOOP' в первую очередь - вместо этого используйте обычные заданные операции. –

ответ

2

В общем, я думаю, что есть три подхода, которые вы можете предпринять:

  • обойтись. Просто позвольте всему этому быть совершенным сразу, как хочет PostgreSQL.
  • Напишите оболочку в код приложения, который устанавливает транзакцию и вызывает вашу функцию. (Это просто сделать в сценарии оболочки, например.)
  • Используйте взломать. Один хак, который существует, вы можете создать свою базу данных в своей собственной базе данных и выполнить субтранзакции через удаленные сеансы. [More information.] (Это, по существу, эквивалентно «обертку в коде приложения» подход, за исключением того, что код приложения еще в PL/PgSQL.)
Смежные вопросы