oracle动态执行create,动态创建Oracle表(动态执行DDL)PLS-00103: Encountered the symbol “CREATE“ when expecting one o...

一、场景:

有一个表结构需要在程序中动态创建,假设表结构为:

create table tb_test(

id varchar2(20),

name varchar2(20)

);

然后添加一个索引:

create index idx_tb_test_id ON tb_test (id);

先说解决方案:

declare

v_sql varchar2(500);

v_isexists number;

begin

-- 检查当前表是否已经存在

select count(1)

into v_isexists

from user_tables

where table_name = 'tb_test';

-- 如果未存在则执行DDL语句

if v_isexists = 0 then

-- 执行建表语句

v_sql := 'create table tb_test(

id varchar2(20),

name varchar2(20)

)';

execute immediate v_sql;

-- 执行建索引语句

v_sql := 'create index idx_tb_test_id ON tb_test (id)';

execute immediate v_sql;

end if;

end;

二、尝试:

编写语句:

begin

create table tb_test(

id varchar2(20),

name varchar2(20)

);

create index idx_tb_test_id ON tb_test (id);

end;

执行报错:

PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:

( begin case declare exit for goto if loop mod null pragma

raise return select update while with

<<

continue close current delete fetch lock insert open rollback

savepoint set sql execute commit forall merge pipe purge

看起来像是有create类的DDL语句不可以在begin里执行。

那么试一下不写begin是否可行,执行以下语句:

create table tb_test(

id varchar2(20),

name varchar2(20)

);

create index idx_tb_test_id ON tb_test (id);

报错:

ORA-00911: 无效字符

当没有begin和end时,遇到;字符就会有这个错误,这个办法同样不可行。

三、解决方案:

可以使用execute immediate '' 方式执行语句:

declare

v_sql varchar2(500);

v_isexists number;

begin

-- 检查当前表是否已经存在

select count(1)

into v_isexists

from user_tables

where table_name = 'tb_test';

-- 如果未存在则执行DDL语句

if v_isexists = 0 then

-- 执行建表语句

v_sql := 'create table tb_test(

id varchar2(20),

name varchar2(20)

)';

execute immediate v_sql;

-- 执行建索引语句

v_sql := 'create index idx_tb_test_id ON tb_test (id)';

execute immediate v_sql;

end if;

end;

注意点:

1、execute immediate每次只可执行一条DDL语句

2、执行的语句中句尾不可带有;符号

本文地址:https://blog.csdn.net/mofeimo110/article/details/107660928

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值