#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 /… .