Попытка преобразовать простую выполнение хранимой процедуры в функцию postgres - не могу получить currval ('table_seq') для функции
-
30-09-2019 - |
Вопрос
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
, если, конечно, он вообще не использует последовательность.