如何在oracle中使用存储过程创建表,如果存在就先删除

这个是我写的:创建存储过程
create or replace procedure createTable
(tname varchar2,createSql varchar2,dropSql varchar2)
is
vcount number(9);
begin
SELECT COUNT(*) INTO vcount FROM tabs WHERE table_name=tname;
if vcount>0 then
execute immediate dropSql;
else
execute immediate createSql;
end if;
end;
调用存储过程
declare
createSql varchar2(100):='create table java7
(
a number(8) primary key,b varchar2(20)
)';
dropSql varchar2(100):='DROP TABLE java7';
begin
createTable('JAVA7',createSql,dropSql);
end;

创建没有问题,但是在调用的是出现错误,没有权限,请教高人指点

如果是没有权限的话,照这下面做就OK了:
grant sysdba, dba, create session, create any table , create any view , create any index , create any procedure ,
   alter any table , alter any procedure , drop any table , drop any view , drop any index , drop any procedure ,
   select any table , insert any table , update any table , delete any table
   to test_data(数据库用户名);
首先我觉得你的逻辑有问题,既然数据库里面存在了表你就删除,但是你却把创建表的执行代码写在了else 条件里面;那意思如果数据库存在了你要创建的这张表,你的逻辑只是把它删除,但是却没有创建。
下面是我整理的代码你看看:

create or replace procedure createtable(
tname varchar2
)
is
v_createsql varchar2(400);
v_dropsql varchar2(100);
v_count number(9);
begin

v_createsql:='create table '||tname||'(
a number(8) primary key,
b varchar2(20))';
v_dropsql:='drop table '||tname||' cascade constraints';
select count(*) into v_count from user_tables where table_name=upper('java7');
if v_count>0 then
execute immediate v_dropsql;
commit;
end if;

execute immediate v_createsql;
commit;
end;

begin
createtable('java7');
end;

-- select * from java7
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-01
没有权限?具体点 或者贴图!
不过应该是没有create table和drop table的权限吧,你试试赋下给此用户看看追问

没有啊 dba的权限呢

第2个回答  2012-07-02
存储过程里面有些关键字是不让出现的 比如create 你自己看下资料
相似回答