首页 新闻 会员 周边

oracle存储过程的一个问题

0
悬赏园豆:30 [待解决问题]

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这行的时候提示的,请问一下存储过程应该怎么去改才能实现我的意图?

wupk的主页 wupk | 初学一级 | 园豆:144
提问于:2017-07-14 16:48
< >
分享
所有回答(2)
0

意思是存储过程现在编译的时候发现表不存在啊,肯定提示了。你可以先手动创建个emp或者是最后一句也使用拼sql的方式执行

webaspx | 园豆:1973 (小虾三级) | 2017-07-14 17:24

,,,其实我想实现的就是在没有表的情况下实现创建表并插入数据的功能

支持(0) 反对(0) wupk | 园豆:144 (初学一级) | 2017-07-14 17:26

@wupk: oracle编译的时候会校验,没表示不让编译通过的

支持(0) 反对(0) webaspx | 园豆:1973 (小虾三级) | 2017-07-14 17:29

@webaspx: 我晓得这个,我在想有没有办法能够绕过验证

支持(0) 反对(0) wupk | 园豆:144 (初学一级) | 2017-07-14 17:32
0

可以通过静态字段的方式先去查看你的表是否存在,并把得到值赋给你定义的变量:

select COUNT(*) into val001 from dba_tables where table_name = '你的表名(注意大小写一直)';

然后用if去判断变量val001,存在值会是1,不存在为0,然后再if里面去写逻辑代码,就不会再报表或者视图不存在了,

因为前期你不存在就有了对表的操作,因此报错。希望有帮助。

ckx0709 | 园豆:414 (菜鸟二级) | 2017-07-20 23:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册