ROLLBACK TO SAVEPOINT внутри хранимой процедуры в postgreSQL 11, и приведенный ниже код не скомпилируется? - PullRequest
0 голосов
/ 12 марта 2020

При обновлении до postgresSQL 11 приведенная ниже хранимая процедура не может быть скомпилирована.

create or replace PROCEDURE savePointProc(startOrRollbak INTEGER, inVar VARCHAR) 
as $$
DECLARE
BEGIN   
    IF startOrRollbak = 0 THEN
       SAVEPOINT inVar;
     ELSE
       ROLLBACK TO SAVEPOINT inVar ;
     END IF;
END;
$$ LANGUAGE plpgsql;

in postgreSQL 11

ОШИБКА: синтаксическая ошибка в или около строки «TO» 8: ОТКЛОНИТЬ В SAVEPOINT inVar; ^ SQL состояние: 42601 символ: 180

Может кто-нибудь указать мне, что неверно в вышеприведенном, что приводит к сбою компиляции процедуры?

Удалили ОШИБКУ: синтаксическая ошибка в или около " TO "

create or replace PROCEDURE savePointProc(startOrRollbak INTEGER, inVar 
VARCHAR) as $$
DECLARE
BEGIN   
   IF startOrRollbak = 0 THEN
      SAVEPOINT inVar;
   ELSE
      ROLLBACK TO inVar ;
   END IF;
END;
$$ LANGUAGE plpgsql;

error :
LINE 8:      ROLLBACK TO inVar ;
                      ^
SQL state: 42601
Character: 180

1 Ответ

0 голосов
/ 13 марта 2020

Похоже, что синтаксис Pl / pg SQL принимает синтаксис SAVEPOINT ... но не ROLLBACK TO ....

Вы можете попробовать использовать Dynami c SQL: он скомпилирован без ошибок, но завершается неудачно во время выполнения (протестировано с PG 11.7):

drop table t;
DROP TABLE
create table t(x int);
CREATE TABLE
create or replace procedure tsp(inVar VARCHAR)
as $$
BEGIN   
      SAVEPOINT inVar;
      insert into t values(1);  
      EXECUTE "ROLLBACK TO $1" USING inVar;
END;
$$ 
LANGUAGE plpgsql;
CREATE PROCEDURE
There is no previous error.
call tsp('sp1');
psql:tsp.sql:13: ERROR:  unsupported transaction command in PL/pgSQL
CONTEXT:  PL/pgSQL function tsp(character varying) line 3 at SQL statement
psql:tsp.sql:14: ERROR:  0A000: unsupported transaction command in PL/pgSQL
CONTEXT:  PL/pgSQL function tsp(character varying) line 3 at SQL statement
LOCATION:  exec_stmt_execsql, pl_exec.c:4194
select * from t;
 x 
---
(0 rows)

Похоже, что правильным способом использования SAVEPOINT в Pl / pg SQL является блок BEGIN / END с предложением EXCEPTION.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...