Попытка преобразовать хранимую процедуру простого исполнения в функцию postgres - невозможно получить CURRVAL ('table_seq') для функции - PullRequest
0 голосов
/ 07 января 2011

Хранимая процедура 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')

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

Ответы [ 2 ]

2 голосов
/ 07 января 2011

Когда вы создаете таблицы с последовательными столбцами, последовательности по умолчанию называются 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;
2 голосов
/ 07 января 2011

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

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

lastval
Вернуть значение, которое было возвращено последним значением nextval в текущем сеансе. это функция идентична currval, за исключением того, что вместо взятия имени последовательности в качестве аргумента он выбирает значение последней последовательности, используемой nextval в текущая сессия. Ошибка вызывать lastval, если nextval еще не был вызван в текущем сеансе.

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

...