为实现新增功能,在表test_tbl中新增序列。序列起始值要= max(id)+1 。尝试了两种两种写法(原理一样)都报错,后来同事提醒,加了一个execute immediate ''才创建成功。
在Oracle的PL/SQL里:
execute immediate 代替了以前Oracle8i中dbms_sql package包。它解析并马上执行动态的sql语句或非运行时创建的pl/sql块。动态创建和执行sql语句性能超前,execute immediate的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码。尽管dbms_sql仍然可用,但是推荐使用execute immediate,因为它获的收益在包之上。
--报错脚本一:
declare
v_seqInit number;
begin
select to_number(max(t.id) + 1) into v_seqInit from test_tbl t;
create sequence test_tbl_seq increment by 1 start
with v_seqInit nomaxvalue nocycle cache 10;
commit;
end;
--报错脚本二:
create sequence test_tbl_seq increment by 1 start
with(select to_number(max(t.id) + 1) from test_tbl t) nomaxvalue nocycle cache 10;
--正确脚本:
declare
v_seqInit number;
begin
select to_number(max(t.id) + 1) into v_seqInit from test_tbl t;
execute immediate 'create sequence test_tbl_seq increment by 1 start with ' ||
v_seqInit;
commit;
end;
参考资料: