由于在存储过程中不支持DML数据控制语言,只能进行DDL数据定义语言,所以,如果想在存储过程中创建或者是删除表的话,就不能用到create table和drop table语句直接执行了,而要用到那可以用executeimmediate(如果Oracle版本是8.15以上),就如同我们在C#或者JAVA连接到数据库之后,执行一条SQL语句一样,先将SQL语句用字符串的形式保存,然后用执行SQL的语句进行执行。另外还因该注意的是,在存储过程中建表需要显式地授予用户create table的权限:grant create table to 用户名;
我们要在数据库中动态创建一个名为t323的表,不能写成:
create or replace procedrue create_table
as
create table t323
(sno int,
sname varchar2(12))
end;
/
示例代码如下:
create or replace procedure drop_tb --判断是否存在表t323,若有,drop掉先
as
vtb int;
sqlstr varchar2(50);
begin --判断是否存在
select count(*) into vtb from tabs where table_name=upper('t323');
if vtb=1 then
execute immediate(sqlstr);
end;
/
exec drop_tb;
as
sqlstr varchar2(50);
begin
execute immediate(sqlstr);
/
exec create_tb; --执行create存储过程
Oracle中动态建表--学习笔记
最新推荐文章于 2023-04-26 17:11:43 发布