ДА , есть IS способ управления вашим заказом. По опыту я обнаружил, что у меня есть таблица Стран, мы назовем ее OLD_COUNTRIES
, которая выглядела так:
-----------------------------------
| ID | CODE | NAME |
-----------------------------------
|112099 | AF | Afghanistan |
|112100 | AA | Albania |
|... | .. | ... |
|112358 | ZB | Zimbabwe |
|112359 | AZ | Azores Islands |
|... | .. | ... |
-----------------------------------
Где я хотел, чтобы элементы, которые были добавлены после основного списка стран (например, Азорские острова и другие острова, которые были добавлены позже), фактически отображались в алфавитном порядке вместе с остальными странами, когда я вставил их в новую таблицу:
CREATE TABLE MYAPP.COUNTRIES
(
ID NUMBER(*, 0)
, CODE NVARCHAR2(20)
, NAME NVARCHAR2(250)
);
Затем я запустил это, чтобы заставить его работать:
INSERT /*+ append */ INTO MYAPP.COUNTRIES (ID, CODE, NAME)
SELECT ID, CODE, NAME FROM MYAPP.OLD_COUNTRIES_TABLE ORDER BY NAME ASC;
COMMIT;
И моя новая таблица COUNTRIES
прошла в алфавитном порядке по имени.
ПРИМЕЧАНИЕ : COMMIT
требуется, иначе вы получите сообщение об ошибке: ORA-12838: cannot read/modify an object after modifying it in parallel
при попытке открыть таблицу для просмотра в Oracle SQL Developer.
ПРИМЕЧАНИЕ : Если вы не используете /*+ append */
, он не будет вставлен в указанном вами порядке - он будет игнорировать ORDER BY
. И я знаю, что он использовал мой ORDER BY
, когда я использовал /*+ append */
, а не просто по умолчанию первичный ключ в старых или новых таблицах, потому что ни у одного из них не было первичных ключей.
ПРЕДУПРЕЖДЕНИЕ : Согласно автору принятого ответа, подсказка в приложении, как и в случае "любой DML или одновременной деятельности ... может привести к другой физической организации". Хотя, возможно, и верно, не выполняйте никаких параллельных операций во время этого, и в вашем коде есть оператор COMMIT
, где я это делаю, чтобы этого не произошло!