Как получить сгенерированный идентификатор из вставленной строки с помощью ExecuteScalar?

Я поймаю это исключение, когда Java из кучи. Если я попытаюсь поместить в ОЗУ множество элементов данных - сначала я поймаю «Сбой связи» и следующий «OutOfMemoryError».

Я зарегистрировал его, и я уменьшаю потребление памяти (удаляю данные 1/2) и все в порядке.

14
задан andrecarlucci 26 August 2009 в 19:48
поделиться

2 ответа

Oracle использует последовательности в качестве столбцов идентификации, если можно так сказать.

Если вы установили последовательность для первичного ключа вашей таблицы, вам также необходимо написать триггер, который будет вставлять Sequence.NextValue или около того в поле первичного ключа.

Предполагая, что вы уже знакомы с этой концепцией, просто запросите свою последовательность, и тогда вы получите ответ. Что очень практикуется в Oracle, так это создание функции, которая будет возвращать INT, а затем внутри вашей функции вы выполняете свой INSERT. Предполагая, что вы правильно настроили свой триггер, вы сможете вернуть значение своей последовательности, запросив его.

Вот пример:

CREATE TABLE my_table (
    id_my_table INT PRIMARY KEY
    description VARCHAR2(100) NOT NULL
)

CREATE SEQUENCE my_table_seq
   MINVALUE 1
   MAXVALUE 1000
   START WITH 1
   INCREMENT BY 2
   CACHE 5;

Если вы хотите управлять автоинкрементом самостоятельно, вот как:

INSERT INTO my_table (
    id_my_table,
    description
) VALUES (my_table_seq.NEXTVAL, "Some description");
COMMIT;

С другой стороны, если вы не хотите заботиться об увеличении ПЕРВИЧНОГО КЛЮЧА,

8
ответ дан 1 December 2019 в 07:12
поделиться

Если вы используете Oracle, вы должны использовать ExecuteNonQuery и ResultParameter. Невозможно записать это как запрос.

using (OracleCommand cmd = con.CreateCommand()) {
    cmd.CommandText = "insert into foo values('foo','bar') returning id into :myOutputParameter";
    cmd.Parameters.Add(new OracleParameter("myOutputParameter", OracleDbType.Decimal), ParameterDirection.ReturnValue);
    cmd.ExecuteNonQuery(); // an INSERT is always a Non Query
    return Convert.ToDecimal(cmd.Parameters["myOutputParameter"].Value);
}
25
ответ дан 1 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: