ORACLE在Execute Immediate中批处理DDL语句

Bet*_*033 5 sql oracle oracle10g ora-00911

我正在尝试在一个Execute Immediate语句中运行多个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;
Run Code Online (Sandbox Code Playgroud)

但是这会导致错误

ORA-00911:无效字符ORA-06512:第10行

如果我自己执行它们,批处理中的每个语句都可以正常运行.如果我接受这个语句并执行它,它将运行良好(使用;在两个语句之间).如果我删除; 在语句之间我得到关于无效选项的不同错误

计划是我将能够构建一个表,导出该表的表模式,包括它的所有alter语句,然后作为安装/更新过程的一部分对另一个系统运行批处理.

那么,我如何在单个执行立即批处理这些DDL语句?或者有更好的方法来做我需要的东西吗?

我必须承认,我有点像甲骨文新手.谢谢大家的耐心等待.

cag*_*boy 2

为什么需要一个 EXECUTE IMMEDIATE 调用?当然只需调用 2 次就可以了吗?

请记住,每个 DDL 语句都包含一个隐式 COMMIT,因此将其作为单个调用执行没有并发优势。

另外,为什么不在第一次调用时正确设置表格呢?你可以做...

创建表 TABLE1(VALUE VARCHAR2(50) NOT NULL, MYVAL2 NVARCHAR2(10))

...而不需要 2 个电话。

另外,您是否看过 DBMS_METADATA...它可以为您生成表等对象的 DDL。