Попытка преобразовать простую выполнение хранимой процедуры в функцию postgres - не могу получить currval ('table_seq') для функции

StackOverflow https://stackoverflow.com/questions/4623475

Вопрос

MySQL хранимая процедура была:

     BEGIN
     set @sql=_sql;
     PREPARE stmt FROM @sql; 
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;
     set _ires=LAST_INSERT_ID();
     END$$

Я пытался преобразовать его в:

     BEGIN  
     EXECUTE _sql;
     SELECT INTO _ires CURRVAL('table_seq');
     RETURN;
     END;

Я получаю ошибку:

SQL error:

ERROR:  relation "table_seq" does not exist
LINE 1: SELECT CURRVAL('table_seq')
                       ^
QUERY:  SELECT CURRVAL('table_seq')
CONTEXT:  PL/pgSQL function "myexecins" line 4 at SQL statement
In statement:
SELECT myexecins('SELECT * FROM tblbilldate WHERE billid = 2')

Используемый запрос предназначен только для целей тестирования. Я считаю, что эта функция используется для получения идентификатора строки вставленной или созданной строки из запроса. Какие-либо предложения?

Это было полезно?

Решение

Когда вы создаете таблицы с последовательными колоннами, последовательности, по умолчанию, названо как tablename_columnname_seq, но кажется, что вы пытаетесь получить доступ tablename_seq. Отказ Так со столом называется foobar и первичный ключевой столбец foobar_id это в конечном итоге foobar_foobar_id_seq.

Кстати, очиститель способ получить первичный ключ после того, как вставка использует RETURNING оговорка INSERT. Отказ Например:

_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;

Другие советы

PostgreSQL говорит, что нет последовательности под названием «Tale_seq». Вы уверены, что это правильное имя? Имя, которое вы использовали, будет зависеть от того, что находится в _sql как каждый SERIAL или BIGSERIAL Получает свою собственную последовательность, вы также можете определить последовательности и провести их вручную.

В любом слючае, lastval() это ближе спички mysql LAST_INSERT_ID(), lastval() Возвращает последнее возвращенное значение из любой последовательности в текущем сеансе:

фанат
Верните значение, недавно возвращенное на NextVal в текущем сеансе. Эта функция идентична Currval, за исключением того, что вместо того, чтобы принять имя последовательности в качестве аргумента, он выбирает значение последней последовательности, используемой в NextVal в текущем сеансе. Это ошибка для вызова lastVal, если NextVal еще не был вызван в текущем сеансе.

С использованием lastval() также означает, что вам не нужно беспокоиться о том, что в _sql, если, конечно, он вообще не использует последовательность.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top