执行立即语句时无效的 ALTER TABLE 选项

invalid ALTER TABLE option when execute immediate statement

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit

Production PL/SQL Release 12.1.0.2.0 - Production

"CORE 12.1.0.2.0 Production" TNS for 64-bit Windows: Version

12.1.0.2.0 - Production NLSRTL Version 12.1.0.2.0 - Production

此代码运行良好

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

但是当我使用 with execute immediate 时给出错误

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;
/

DBMS 输出

Max Value: 8

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

错误

Error starting at line : 1 in command - 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; Error report - ORA-01735: invalid ALTER TABLE

option ORA-06512: at line 9

  1. 00000 - "invalid ALTER TABLE option"

*Cause:

*Action:

编辑:问题是“;”

所以答案是:

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 ||')';

试试这个

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;
/