sql - 立即执行中的ORACLE批处理DDL语句

标签 sql oracle oracle10g ora-00911

我正在尝试在一个“立即执行”语句中运行多个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/

相关文章:

mysql select 基于两个条件

sql - 在需要条件的上下文中指定的非 bool 类型表达式,位于 'Begin' 附近

string - 检测重叠范围并在 oracle 中纠正

sql - 从 Oracle 中的一个非常大的记录集中选择一个记录子集耗尽内存

sql - oracle日期范围

MySQL - 至少其中之一且大于 3 个表

sql - 如何在 SQL Server 中反转字符串

oracle - Oracle 分页的最佳实践?

java - 无法在 Java 应用程序中的 SODA 中添加的文档存储上进行 SELECT

sql - 如何删除未命名的主键约束