Oracle中执行动态SQL(execute immediate)

    为实现新增功能,在表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;

参考资料:http://zhidao.baidu.com/question/317167678.html 

你可能感兴趣的:(immediate,execute)