在oracle plsql程序块中,只能使用DML和常规的事务控制语句(TCL),
你这个是在块中使用了DDL,这个是不允许的,因为oracle的plsql是提前bind的(预编译),而ddl所影响的对象往往是不存在的,这个是预编译所不允许的,所以如果想在块中使用ddl,则必须使用动态sql(所起作用就是让编译推迟到runtime)
原理讲的可能有点模糊,呵呵。感兴趣的可以系统的看下相关资料,这里把你的程序简单改动下就可以通过编译了:
declare
a varchar2(50):='20100422';
b varchar2(50):='20100424';
begin
execute immediate 'create table test as select * from oct_t_ehr where ehr_date between a and b';
end;
declare
a number :=0;
b varchar2(20):= 'XX';
begin
select * from 表1 where 条件1 between a and b;
end;
是这个意思吗