我正在尝试在一个“立即执行”语句中运行多个ddl语句。
我以为这会很简单,但似乎我弄错了。
这个想法是这样的:
declare v_cnt number;
begin
select count(*) into v_cnt from all_tables where table_name='TABLE1' and owner = 'AMS';
if v_cnt = 0 then
execute immediate 'CREATE TABLE TABLE1(VALUE VARCHAR2(50) NOT NULL) ALTER TABLE TABLE1 ADD (MYVAL2 NVARCHAR2(10))';
end if;
end;
但这会导致错误
ORA-00911: invalid character ORA-06512: at line 10
如果我自己执行它们,则批处理中的每个语句都运行良好。如果我接受此语句并执行它,它将运行良好(在2条语句之间使用;)。如果我删除;在语句之间,我得到关于无效选项的另一个错误
计划是,我将能够构建一个表,导出该表的表模式(包括所有的alter语句),然后在安装/更新过程中针对另一个系统运行该批处理。
那么,如何在单个立即执行中批处理这些DDL语句?还是有更好的方法来做我需要的?
我必须承认,我有点甲骨文。谢谢大家的耐心配合。
最佳答案
为什么您需要一个EXECUTE IMMEDIATE调用?当然可以按2个电话进行通话吗?
请记住,每个DDL语句都包含一个隐式COMMIT,因此将其作为单个调用进行并没有好处。
另外,为什么不只在第一次调用中正确设置表呢?你可以做...
创建表TABLE1(VALUE VARCHAR2(50)NOT NULL,MYVAL2 NVARCHAR2(10))
...而不是需要打2个电话。
另外,您是否看过DBMS_METADATA ...它可以为您的对象(例如表)生成DDL。
关于sql - 立即执行中的ORACLE批处理DDL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1241611/