Как отключить последовательность в оракуле - PullRequest
0 голосов
/ 18 января 2019

У меня есть сценарий, в котором мне нужно вставить записи в Oracle через SAS. Таблица содержит последовательность, поэтому для вставки каждой записи мне нужно сначала подключиться к Oracle и получить последовательность (опция nextval).

Я хочу сократить это время подключения (для отправки 1k записей, подключения 1K раз).

Другая проблема заключается в том, что я не могу просто прочитать максимальную последовательность и изменить последовательность позже, указав количество записей, которое необходимо отправить, поскольку есть другие пользователи, одновременно отправляющие данные из других систем.

Так мне нужна помощь, чтобы отключить последовательность? Вместо блокировки самого стола.

Ответы [ 4 ]

0 голосов
/ 19 января 2019

Просто получите все 1000 NEXTVAL в одном запросе, это должно быть быстро.

CREATE SEQUENCE vaibhav_seq;

WITH t(n) AS (
    SELECT 1 FROM DUAL
    UNION ALL
    SELECT n + 1 FROM t
        WHERE n < 1000)
SELECT vaibhav_seq.NEXTVAL FROM t;

Затем вы можете использовать их со своими INSERT заявлениями.

0 голосов
/ 18 января 2019

Если вам нужно только отправить в базу данных, вам не нужно , чтобы получить последовательность nextval. Просто используйте его в вашем INSERT утверждении:

CREATE TABLE vaibhav (
    id NUMBER PRIMARY KEY,
    data VARCHAR(100)
);
CREATE SEQUENCE vaibhav_seq;

INSERT INTO vaibhav(id, data)
    VALUES (vaibhav_seq.nextval, 'foo');
INSERT INTO vaibhav(id, data)
    VALUES (vaibhav_seq.nextval, 'bar');

SELECT id, data FROM vaibhav;

  ID DATA
---- ----------
   1 foo
   2 bar
0 голосов
/ 18 января 2019

Если вы знаете, N, количество записей в SAS, которое нужно вставить, вы можете выполнить сквозной запрос, чтобы получить N следующих значений из последовательности.

%let N_SEQ_NEEDED = 1000;

Proc SQL;
  connect to oracle …;
  create table work.sequence_numbers as select * from connection to oracle (
    SELECT 
      ROWNUM n,
      THE_NEEDED_SEQUENCE.nextval sequence_value
    FROM   ( 
      SELECT 1 arbitrary_alias
      FROM   dual
      CONNECT BY LEVEL <= &N_SEQ_NEEDED
    )        
  );

Техника CONNECT BY от http://www.orafaq.com/wiki/Oracle_Row_Generator_Techniques

Нет никакой гарантии последовательной природы значений N nextval - вам просто нужно знать, что они уникальны и никогда не будут повторяться в любом будущем поиске следующего.

Объедините или обновите ваш набор данных SAS, назначив полученные значения sequence_values ​​столбцу последовательности в наборе данных, а затем выполните INSERT в Oracle через ваш код SAS.

0 голосов
/ 18 января 2019

Ну, я не думаю, что вы можете отключить это. Что вы можете сделать, это создать триггер базы данных, который позаботится о вставке его значения. Вот пример:

SQL> create table test (id number, col varchar2(20));

Table created.

SQL> create sequence seq_test;

Sequence created.

SQL> create or replace trigger trg_bi_test
  2    before insert on test
  3    for each row
  4  begin
  5    :new.id := nvl(:new.id, seq_test.nextval);
  6  end;
  7  /

Trigger created.

SQL> insert into test (col) values ('Little');

1 row created.

SQL> insert into test (col) values ('Foot');

1 row created.

SQL> select * from test;

        ID COL
---------- --------------------
         1 Little
         2 Foot

SQL>

Как видите, вам не нужно сначала извлекать его значение, об этом позаботится база данных. Обратите внимание, что производительность, вероятно, пострадает, если вы загрузите много данных, так как триггер сработает для каждой вставленной строки.

Для пользователей, которые используют «старый» подход (который у вас есть), ничего не меняется:

SQL> insert into test (id, col) values (seq_test.nextval, 'Stack');

1 row created.

SQL> select * from test;

        ID COL
---------- --------------------
         3 Stack
         1 Little
         2 Foot

SQL>

Посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...