oracle存储过程的一个问题

create or replace procedure evejb
as
v_createsql1 varchar2(400);

v_dropsql1 varchar2(100);
v_count1 number(9);

begin

v_createsql1:='create table emp (empno nvarchar2(60),empname nvarchar2(60),sex nvarchar2(60),sal nvarchar2(60),dept nvarchar2(60),city nvarchar2(60))';
v_dropsql1:='drop table emp';

select count(*) into v_count1 from user_tables where table_name='EMP';

if v_count1>0
then
execute immediate v_dropsql1;
execute immediate v_createsql1;

    commit;
    else
    execute immediate v_createsql1;
    commit;
    end if;
    insert into emp values('XX01','王小二','man','5400','XX','HZ');

end;
我这边写了一个存储过程,想实现如下效果,如果emp表存在,就先drop,再create,如果不存在,就直接create,表建好之后,再insert into到这个表,但是在编译的时候提示,表或试图不存在,这个是在检查insert into emp这行的时候提示的,请问一下存储过程应该怎么去改才能实现我的意图?

5个回答

可能创建表权限不足哦

在存储过程中对数据库中的表进行操作时需要授予相应的权限给操作用户才可以,否则即使拥有dba权限都没办法操作这张表,可以grant delete,insert,update,select on emp to username;

表名大小写是不是要统一下,这字段名也是如此,小写的话要加双引号,不知道是不是这个坑

execute immediate 'insert into emp values(''XX01'',''王小二'',''man'',''5400'',''XX'',''HZ'')'

可以使用动态sql。。这样再确保表存在的前提下再执行insert 语句就可以了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐