недопустимая опция ALTER TABLE при немедленном выполнении оператора

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64-разрядная версия

Производственная версия PL / SQL 12.1.0.2.0 - Производство

TNS "CORE 12.1.0.2.0 Production" для 64-битной Windows: Версия

12.1.0.2.0 - Производственная версия NLSRTL 12.1.0.2.0 - Производственная

Этот код работает хорошо

ALTER TABLE ACTIONLOG MODIFY (ID GENERATED ALWAYS AS IDENTITY START WITH 8);

но когда я использовал с выполнением немедленной выдачи ошибки

declare 
mvalue INTEGER; 
exp varchar(1000);
begin 
select max(coalesce(ID,0))+1 into mvalue from ACTIONLOG; 
exp := 'ALTER TABLE ACTIONLOG MODIFY (ID GENERATED ALWAYS AS IDENTITY START WITH '|| mvalue ||');';
dbms_output.Put_line('Max Value: '|| mvalue);
DBMS_OUTPUT.PUT_LINE('Expression: ' || exp);
execute immediate exp; 
end;
/

Вывод СУБД

Максимальное значение: 8

Выражение: ALTER TABLE ACTIONLOG MODIFY (ИДЕНТИФИКАЦИЯ, СОЗДАВАЕМАЯ ВСЕГДА, КАК ИДЕНТИФИКАЦИЯ НАЧИНАЕТСЯ С 8);

Ошибка

Ошибка при запуске со строки: 1 в команде - объявить mvalue INTEGER; exp

варчар (1000); begin select max (coalesce (ID, 0)) + 1 в mvalue из

ACTIONLOG; exp: = 'ALTER TABLE ACTIONLOG MODIFY (ID СОЗДАЕТСЯ ВСЕГДА

КАК ИДЕНТИЧНОСТЬ НАЧИНАЕТСЯ С »|| mvalue || ');'; dbms_output.Put_line ('Макс.

Значение: '|| mvalue); DBMS_OUTPUT.PUT_LINE ('Выражение:' || exp);

выполнить немедленное exp; конец; Отчет об ошибке - ORA-01735: неверный ALTER TABLE

вариант ORA-06512: в строке 9

  1. 00000 - "неверная опция ALTER TABLE"

*Причина:

*Действие:

Изменить: проблема заключалась в ";"

Итак, ответ таков:

exp := 'ALTER TABLE ACTIONLOG MODIFY (ID GENERATED ALWAYS AS IDENTITY START WITH '|| mvalue ||');';

вместо того

 exp := 'ALTER TABLE ACTIONLOG MODIFY (ID GENERATED ALWAYS AS IDENTITY START WITH '|| mvalue ||')';

person Fatih    schedule 24.12.2015    source источник


Ответы (1)


Попробуй это

declare 
mvalue INTEGER; 
exp varchar(1000);
begin 
select max(coalesce(ID,0))+1 into mvalue from ACTIONLOG; 
--exp := 'ALTER TABLE ACTIONLOG MODIFY (ID GENERATED ALWAYS AS IDENTITY START WITH '|| mvalue ||');';
dbms_output.Put_line('Max Value: '|| mvalue);
--DBMS_OUTPUT.PUT_LINE('Expression: ' || exp);
execute immediate 'ALTER TABLE ACTIONLOG MODIFY (ID GENERATED ALWAYS AS IDENTITY START WITH '|| mvalue ||')'; 
end;
/
person Community    schedule 24.12.2015
comment
Спасибо. Проблема в том; в конце заявления. Когда я удалил; мой сценарий тоже работает. Итак: exp: = 'ALTER TABLE ACTIONLOG MODIFY (ID, СОЗДАВАЕМЫЙ ВСЕГДА КАК ИДЕНТИФИКАЦИЯ НАЧИНАЕТСЯ С' || mvalue || ')'; тоже правильно - person Fatih; 24.12.2015