2015-08-31 2 views
0

У меня есть следующие хранимые процедуры:Необходимо восстановить BIGSERIAL «первичный ключ» значение из Informix хранимой процедуры

CREATE PROCEDURE eukno(pk BIGINT, requestee VARCHAR(20)) 
RETURNING BIGINT; 
DEFINE eunid BIGINT; 
INSERT INTO ent_uniq (eunid, eunreq) VALUES (pk, requestee); 
RETURN eunid; 
END PROCEDURE; 

я получаю значение, вставленное в таблицу, но мне нужно значение первичного ключа eunid быть возвращены для точного значения во время этой вставки. eunid - первичный ключ BIGSERIAL с начальным значением 9999000000, поэтому на моей первой вставке eunid автоматизирует производство 9999000001 Хранимая процедура выполняется с параметрами (0, 'username'), а первичная автоматически увеличивается на единицу. Необходимо получить точную единую единицу во время вставки, так как многие пользователи запросят этот идентификатор за один момент.

+0

Я изменил процедуру следующим образом: – chaos

+0

СОЗДАТЬ ПРОЦЕДУРУ eukno (pk BIGINT) ВОЗВРАТ BIGINT; DEFINE eunid BIGINT; INSERT INTO ent_uniq (eunid) VALUES (pk); RETURN DBINFO ('serial8'); ПРОЦЕДУРА КОНЕЦ; – chaos

+0

С этим изменением, однако, я все еще 0, значение вставки, которое я указал, а не фактическое значение, созданное базой данных. – chaos

ответ

0

Функция DBINFO('serial8') возвращает значение ключа для последнего столбца SERIAL8. Вы вставляете в BIGSERIAL; вам нужно вместо этого использовать DBINFO('bigserial').

SQL[2163]: CREATE PROCEDURE eukno(pk BIGINT, requestee VARCHAR(20)) 
     > RETURNING BIGINT; 
     > INSERT INTO ent_uniq (eunid, eunreq) VALUES (pk, requestee); 
     > RETURN DBINFO('bigserial'); 
     > END PROCEDURE; 
SQL[2164]: execute procedure eukno(57, 'varieties'); 
57 
SQL[2165]: execute procedure eukno(0, 'boredom'); 
58 
SQL[2166]: 

Обратите внимание, что SERIAL представляет собой 4-байтовый последовательный тип; оба SERIAL8 и BIGSERIAL поддерживают 8-байтовые диапазоны серийных номеров, но BIGSERIAL - лучший тип для использования (по разным причинам).

Можно также отметить, что в вашем коде, локальные переменная eunid одновременно полностью отделен от ent_uniq.eunid колонны (это происходит, чтобы иметь такое же имя, что и колонки, но это все), и либо неинициализированный при возврате или неиспользуемых ,