>>>Мне необходимо знать 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 в системной локали.