The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"PostgreSQL"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

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

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

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

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

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

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: PostgreSQL"
Сообщение от tamerlan emailИскать по авторуВ закладки on 06-Окт-02, 21:45  (MSK)
>>Мне необходимо знать 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? М.б. это просто флаг?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: PostgreSQL"
Сообщение от yur Искать по авторуВ закладки on 07-Окт-02, 04:06  (MSK)
>>>Мне необходимо знать 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 в системной локали.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру