Это звучит как работа для последовательности. Последовательность - это объект SQL, который возвращает следующий порядковый номер каждый раз, когда его запрашивают. Он реализован в области данных, но это не имеет для вас никакого значения. Важно то, что последовательность создается и используется с использованием SQL.
Чтобы создать последовательность, в ее простейшей форме вы вводите следующую инструкцию SQL:
CREATE SEQUENCE NEXT_ORDER_NO;
Дополнительную информацию о создании последовательностей можно найти в Центре знаний .
Чтобы сгенерировать число из этой последовательности, вы можете включить NEXT VALUE FOR <sequence name>
в инструкцию SQL, например:
INSERT INTO ORDER_MASTER (ORDER_NO, CUSTOMER_NO)
VALUES (NEXT VALUE FOR NEXT_ORDER_NO, 15);
Вставляет в таблицу ORDER_MASTER новую запись с номером следующего заказа из последовательности и значением 15 в качестве номера клиента.
Чтобы получить самое последнее значение, сгенерированное из последовательности, которую вы используете PREVIOUS VALUE FOR <sequence name>
, например:
INSERT INTO ORDER_DETAIL (ORDER_NO, ORDER_LINE, ITEM_NO)
VALUES (PREVIOUS VALUE FOR NEXT_ORDER_NO, 1, 'AX14450')
При этом в таблицу ORDER_DETAIL вставляется запись с последним сгенерированным ORDER_NO, строкой заказа 1 и номером позиции «AX14450». Вы можете использовать PREVIOUS VALUE FOR <sequence name>
столько раз, сколько захотите, и он всегда будет возвращать одно и то же значение. Вы также можете найти дополнительную информацию в Центре знаний .
Есть несколько предостережений. NEXT VALUE
и PREVIOUS VALUE
ведут себя так, как вы ожидаете, даже если несколько заданий используют одну и ту же последовательность. Задание 1 не будет иметь доступа к сгенерированным значениям задания 2 и наоборот. Но это означает, что в зависимости от того, как вы определяете последовательность, вы можете получить пробелы в своих порядковых номерах или они могут быть выданы не по порядку. Обязательно прочитайте обе ссылки, которые я предоставил, для более подробных объяснений.
Изменить:
Если вы не хотите использовать NEXT VALUE
непосредственно во вставке, вы также можете использовать VALUES INTO
, например:
VALUES NEXT VALUE FOR NEXT_ORDER_NO INTO :<local variable>
Более подробную информацию об этом утверждении можно найти в Центре знаний .
Редактировать (2)
В качестве альтернативы последовательности, вы можете использовать столбец идентификаторов (это то, что вам нужно на основе ваших комментариев), но вам не нужно делать что-то безумное в вашем SQL, чтобы получить последнее назначенное значение идентификатора. , Используйте IDENTITY_VAL_LOCAL
вот так:
INSERT INTO HTABLE (NAME, AGE) VALUES ('Mark', 51);
INSERT INTO DTABLE (hseq,Address,Zip)
VALUES (IDENTITY_VAL_LOCAL(),'1701 creek ave', 19670);
INSERT INTO DTABLE (hseq,Address,Zip)
VALUES (IDENTITY_VAL_LOCAL(), '22701 creek ave', 19270);
Значение IDENTITY_VAL_LOCAL()
изменяется только при выполнении INSERT
в таблице со столбцом идентификаторов. Как и PREVIOUS VALUE
, IDENTITY_VAL_LOCAL()
вернет ноль, если ему не предшествует INSERT
в таблице со столбцом идентификаторов. А также, как и PREVIOUS VALUE
, INSERT
должен выполнять ту же работу, что и вызов IDENTITY_VAL_LOCAL()
, чтобы иметь какое-либо влияние.
Найти сравнение идентичных столбцов и последовательностей здесь .