Получить номер seq, используемый оператором вставки, вызванным из C # (оракул) - PullRequest
2 голосов
/ 24 сентября 2010

Мне нужно вставить запись в таблицу и установить значение столбца (например, orderid) в уникальный #. И верните использованное число.

Я думал, что процесс будет состоять в том, чтобы использовать последовательность и оператор вставки с nextval:

insert into ordersTable(orderid) values(ordernums.nextval);

Но как мне получить номер, который был использован? Я думаю, что я должен получить его обратно из вызова вставки, иначе nextval (или currval) мог бы измениться, если я сделаю повторный запрос.

Но я не уверен, как это сделать. Я подумал, что одним из способов решения этой проблемы будет добавление моего единственного уникального значения в поле, а затем запрос этого значения.

Есть ли другой способ сделать это? Я полагаю, что я что-то упустил на уровне sql?

CtC

1 Ответ

9 голосов
/ 24 сентября 2010

Насколько я знаю, в Oracle 9i + есть предложение RETURNING:

DECLARE v_orderid ORDERSTABLE%TYPE;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (ordernums.nextval)
RETURNING orderid INTO v_orderid;

Альтернативой является заполнение переменной перед оператором INSERT:

Внутри функции:

DECLARE v_orderid ORDERSTABLE%TYPE := ORDERNUMS.NEXTVAL;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (v_orderid);

RETURN v_orderid;

Использование параметра OUT:

CREATE OR REPLACE PROCEDURE ORDER_INS(out_orderid OUT ORDERSTABLE%TYPE) 
AS
BEGIN

out_orderid := ORDERNUMS.NEXTVAL;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (out_orderid);

END;

Кроме того, имейте в виду, что CURRVAL последовательности зависит от сеанса. Независимо от того, сколько времени вы вызывали NEXTVAL в текущем сеансе, и сколько бы других сеансов не вызывали NEXTVAL в той же последовательности, ordernums.currval всегда будет возвращать последнее значение последовательности, которое было передано вашему сеансу. Таким образом, хотя у вас есть различные варианты получения значения из INSERT, в этом может не быть необходимости - вы можете просто захотеть сослаться на ordernums.currval в последующих инструкциях. Конечно, поскольку CURRVAL зависит от сеанса, это не имеет смысла (и будет возвращать ошибку), если вы вызывали CURRVAL в сеансе до того, как вызывали NEXTVAL для той же последовательности.

...