Создание последовательности внутри анонимного блока с помощью немедленного выполнения

#sql #oracle #oracle10g #execute-immediate

#sql #Oracle #oracle10g #выполнить-немедленно

Вопрос:

Я пытаюсь создать последовательность внутри анонимного блока (это скрипт, который будет запущен в нескольких средах), и я использую немедленное выполнение, это код:

 SELECT MAX(ID_VINCULACION)
INTO vMAX_VINCULACION
FROM SA_ENTIDADES_VINCULADAS;

EXECUTE IMMEDIATE 'CREATE SEQUENCE "GPP"."SEQ_ENTIDADES_VINCULADAS" MINVALUE 1  MAXVALUE 99999999999999999999999999 INCREMENT BY 1 START WITH ' || vMAX_VINCULACION || ' NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL';
  

Я использую select max для начала, чтобы я мог получить самый большой существующий идентификатор, но он выдает эту ошибку:

ORA-00933: команда SQL неправильно завершена ORA-06512: в строке 40 ORA-06512: в строке 40

Я точно не знаю почему, поэтому я попытался использовать немедленное выполнение … Используя, это результирующий код:

 SELECT MAX(ID_VINCULACION)
    INTO vMAX_VINCULACION
    FROM SA_ENTIDADES_VINCULADAS;

EXECUTE IMMEDIATE 'CREATE SEQUENCE "GPP"."SEQ_ENTIDADES_VINCULADAS" MINVALUE 1  MAXVALUE 99999999999999999999999999 INCREMENT BY 1 START WITH :a NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL' USING vMAX_VINCULACION;
  

И это выдает другую ошибку… :

ORA-01722: недопустимый номер

Я тоже не понимаю этого, поскольку функция Max возвращает число. Я попытался запустить запрос, и он возвращает 5.

Итак, я здесь совсем запутался, надеюсь, вы сможете мне помочь.

Заранее спасибо.

Комментарии:

1. EXECUTE IMMEDIATE предназначен для операторов без параметров.

Ответ №1:

Немедленное выполнение вычисляется во время выполнения. Я выполнил тест, и он работает без проблем (в моем тесте я удаляю двойные кавычки, потому что они вам не нужны). Попробуйте напечатать по dbms_output результату execute immediate . Вероятно, ваш select max не дает вам правильного номера.

Обновить

Параметры NOKEEP NOSCALE GLOBAL недоступны в 10g

Создайте последовательность 10g

 declare
v_max pls_integer;
begin
   SELECT 1000 INTO v_max FROM dual;
EXECUTE IMMEDIATE 'CREATE SEQUENCE MY_SEQ MINVALUE 1  MAXVALUE 99999999999999999999999999 INCREMENT BY 1 START WITH '||v_max||' 
                   NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL' ;
end;
/
  

Тест

 SQL> declare
v_max pls_integer;
   begin
    SELECT 1000 INTO v_max FROM dual;
  EXECUTE IMMEDIATE 'CREATE SEQUENCE MY_SEQ MINVALUE 1  MAXVALUE 99999999999999999999999999 INCREMENT BY 1 START WITH '||v_max||'
                    NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL' ;
end;
/  

PL/SQL procedure successfully completed.

SQL> select sequence_name, min_value, max_value from dba_sequences where sequence_name = 'MY_SEQ' ;

SEQUENCE_NAME
--------------------------------------------------------------------------------
 MIN_VALUE  MAX_VALUE
---------- ----------
MY_SEQ
         1 1.0000E 26


SQL> SQL> select my_seq.nextval from dual ;

   NEXTVAL
----------
      1000
  

Комментарии:

1. Спасибо за ответ. Я попробовал то, что вы сказали, и удалил двойные кавычки. Я также попробовал dbms_ouput из max и возвращает 5, а также использовал dbms_ouput, чтобы посмотреть, как будет выглядеть выполнение: ВЫПОЛНИТЬ НЕМЕДЛЕННОЕ СОЗДАНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ GPP.SEQ_ENTIDADES_VINCULADAS МИНИМАЛЬНОЕ ЗНАЧЕНИЕ 1 МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ 999999999999999999999999999, УВЕЛИЧИТЬ На 1, НАЧАТЬ С 5. NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL И по-прежнему выдает первую ошибку, команда ORA-00933 SQL не выполняется. должным образом законченный

2. если вы запустите эту команду без использования PLSQL, сработает ли она? Я имею в виду , это должно сработать

3. Хорошо, попробовал то, что вы сказали, и с помощью небольшого теста, я думаю, я увидел проблему. Я должен удалить последние три параметра при создании последовательности: NOKEEP, NOSCALE и GLOBAL. Не знаю почему, но это работает именно так. Спасибо тебе за помощь, парень.

4. @robexpo, можете ли вы поддержать ответ? кстати, какую версию Oracle вы используете? мой тест был сделан в 19с

5. добро пожаловать. Действительно, это причина. эти параметры недоступны в этой старой версии. docs.oracle.com/cd/B12037_01/server.101/b10759 /… .