URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 21534
[ Назад ]

Исходное сообщение
"PostgreSQL"

Отправлено tamerlan , 05-Окт-02 03:09 
Мне необходимо знать id только что вставленной записи.
Вставляю запись INSERT-ом и хочу знать id (в идеале primary key) только что вставленной записи (в рамках транзакции).

Заранее благодерен все, кто подскажет, как это сделать.

P.S.
curval пробовал, но он работает только, если работала nextval, а значение поля не всегда определяется nextval, т.е. тип id не всегда serial.

Да, может еще кто-нибудь подскажет, как сделать так, чтоб после ORDER BY выборка сортировалась по алфавиту (русскому), а то все перемешано. Чувствую, что проблема в локали, но вроде везде ru_RU.KOI8-R.


Содержание

Сообщения в этом обсуждении
"RE: PostgreSQL"
Отправлено yur , 06-Окт-02 03:05 
>Мне необходимо знать id только что вставленной записи.
>Вставляю запись INSERT-ом и хочу знать id (в идеале primary key) только
>что вставленной записи (в рамках транзакции).
>
>Заранее благодерен все, кто подскажет, как это сделать.

Использовать OID, возвращаемый INSERTом не пробовал? Если вставляется одна строка, то это самый простой  путь, imho...

>
>Да, может еще кто-нибудь подскажет, как сделать так, чтоб после ORDER BY
>выборка сортировалась по алфавиту (русскому), а то все перемешано. Чувствую, что
>проблема в локали, но вроде везде ru_RU.KOI8-R.

Правильно поставить LANG и LC_ALL перед initdb...



"RE: PostgreSQL"
Отправлено tamerlan , 06-Окт-02 21:45 
>>Мне необходимо знать id только что вставленной записи.
>>Вставляю запись INSERT-ом и хочу знать id (в идеале primary key) только
>>что вставленной записи (в рамках транзакции).
>>
>>Заранее благодерен все, кто подскажет, как это сделать.
>
>Использовать OID, возвращаемый INSERTом не пробовал? Если вставляется одна строка, то это
>самый простой  путь, imho...
>

А не подскажешь как получить это OID, возвращаемый INSERT? В мане очень непонятно про это написано. Как получить - я так и не понял.

>>
>>Да, может еще кто-нибудь подскажет, как сделать так, чтоб после ORDER BY
>>выборка сортировалась по алфавиту (русскому), а то все перемешано. Чувствую, что
>>проблема в локали, но вроде везде ru_RU.KOI8-R.
>
>Правильно поставить LANG и LC_ALL перед initdb...

А где их надо поставить? Я думал они ставятся в файле initdb.i18n. Но до инициализации этого файла нет. Я подумал что их нужно руками set'ом поставить, но не знаю, что такое LC_ALL. LANG я поставил ru_RU.KOI8-R. Это правильно? И чему должна быть равна LC_ALL? М.б. это просто флаг?


"RE: PostgreSQL"
Отправлено yur , 07-Окт-02 04:06 
>>>Мне необходимо знать id только что вставленной записи.
>>>Вставляю запись INSERT-ом и хочу знать id (в идеале primary key) только
>>>что вставленной записи (в рамках транзакции).
>>>
>>>Заранее благодерен все, кто подскажет, как это сделать.
>>
>>Использовать OID, возвращаемый INSERTом не пробовал? Если вставляется одна строка, то это
>>самый простой  путь, imho...
>>
>
>А не подскажешь как получить это OID, возвращаемый INSERT? В мане очень
>непонятно про это написано. Как получить - я так и не
>понял.
>

Легко. Например, в pl/pgsql:

DROP TABLE Mytable;
CREATE TABLE Mytable;
(
PK integer DEFAULT nextval('Mytable_pk_seq') UNIQUE NOT NULL PRIMARY KEY,
id integer,
value text
);
DROP SEQUENCE Mytable_pk_seq;
CREATE SEQUENCE Mytable_pk_seq;

CREATE OR REPLACE FUNCTION insertMyRow
(
int4 ,
varchar
)
RETURNS int4
AS '
DECLARE
-- return variable
retval int4:=0;
key_  ALIAS FOR $1;
value_ ALIAS FOR $2;
-- local variables
record1 record;
oid1 int4;
BEGIN
INSERT INTO mytable
(id,value)
VALUES
(key_,value_);
-- Get the oid of the row just inserted.
GET DIAGNOSTICS oid1 = RESULT_OID;
-- Get the TABLENAME pk.
FOR record1 IN SELECT pk FROM mytable where oid = oid1
LOOP
retval := record1.pk;
END LOOP;

-- If retval is NULL, insert failed or something is wrong.
IF retval is NULL THEN
return -1; END IF;
-- It should also be greater than 0, or something else is wrong.
IF retval < 1 THEN
return -2; END IF;
return retval;
END;
' LANGUAGE 'plpgsql';

Но я, таки, в упор не понимаю, чем sequence с curval() не нравятся?
Чем городить весь вышеприведенный гемор, гораздо легче сказать
INSERT INTO .... ; SELECT curval(lala_seq);

>>>
>>>Да, может еще кто-нибудь подскажет, как сделать так, чтоб после ORDER BY
>>>выборка сортировалась по алфавиту (русскому), а то все перемешано. Чувствую, что
>>>проблема в локали, но вроде везде ru_RU.KOI8-R.
>>
>>Правильно поставить LANG и LC_ALL перед initdb...
>
>А где их надо поставить? Я думал они ставятся в файле initdb.i18n.
>Но до инициализации этого файла нет. Я подумал что их нужно
>руками set'ом поставить, но не знаю, что такое LC_ALL. LANG я
>поставил ru_RU.KOI8-R. Это правильно? И чему должна быть равна LC_ALL? М.б.
>это просто флаг?

LC_ALL - это такой LANG продвинутый в  Solarisе:)

Postgres должен быть собран с поддержкой enable-multibyte;
su - postgres
export LANG=ru_RU.KOI8-R LC_ALL=ru_RU.KOI8-R
/usr/local/pgsql/bin/initdb -E KOI8 -D /usr/local/pgsql/data

Дурацкий вопрос - а sort в системе у вас правильно работает? Postgres сильно зависит от работы LC_COLLATE в системной локали.