内立即执行ORACLE配料DDL语句(ORACLE Batching DDL statements

2019-09-22 10:35发布

我想一个内立即执行语句来运行多个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:无效字符ORA-06512:在第10行

每个批次中的语句,如果我自己执行它们运行良好。 如果我采取这一说法,并执行它,它将会运行得很好(用; 2个语句之间)。 如果我删除; 我语句之间获得有关无效选项不同的错误

该计划是,我就可以建一个表,导出表结构此表包括它所有的改变语句,然后运行对另一个系统批量为安装/更新过程的一部分。

所以,我怎么批次内的单个这些DDL语句立即执行? 还是有更好的方法做我需要我?

我有点甲骨文福利局的,我必须承认。 谢谢大家的耐心等待。

Answer 1:

为什么你需要一个EXECUTE立即打电话? 当然只是做它作为2个电话?

熊在每个DDL语句包含隐式提交的心态,所以没有并发性的好处做它作为一个单一的呼叫。

此外,为什么不设置表正确的第一个电话? 你可以这样做?

CREATE TABLE TABLE1(VALUE VARCHAR2(50)NOT NULL,MYVAL2 NVARCHAR2(10))

而不是需要2个来电...。

此外,有你看着DBMS_METADATA ...它可以为对象生成DDL如你表。



Answer 2:

分号是不是Oracle的SQL语法的一部分。 SQL * Plus和其他客户端工具使用分号信号SQL语句的结束,但服务器不会看到它。

我们可以强制SQL * Plus来分号传递给DB:

SQL> set sqlterminator off
SQL> select * from user_tables;
  2  /
select * from user_tables;
                         *
ERROR at line 1:
ORA-00911: invalid character

如果我把这个语句并执行它,它将会运行得很好(用; 2个语句之间),你正在使用的客户端工具,打破它分为两个调用数据库。

所以,我不认为这是可能通过内部的立即执行多个语句。

我想,人们可以调用execute立即用含有匿名PL / SQL块的字符串,个人调用里面立即执行......我不知道这样做的问题是什么。 ;)



文章来源: ORACLE Batching DDL statements within a Execute Immediate