写一个存储过程,判断如果表a存在则执行drop命令,否则就先创建表a
现在是这样的
create or replace procedure aaa Authid Current_User is
beginexecute immediate 'drop table a';--这个之前加一个判断,如果表存在则执行这个,不存在就直接执行下一条execute immediate 'create table a(a_id number(12) not null)';end aaa;能不能加一个判断条件,这样的话就不会出现不能执行的问题了

解决方案 »

  1.   

    select * from user_tables where table_name='';
    select * from all_tables where table_name='' and owner='';注意表名大写
      

  2.   

    其实检查user_objects更合适些.
    因为重名的不一定就是table
      

  3.   

    直接在procedure里面写if else就行
      

  4.   

    a int ; sql varchar2(2000) ;
     sql := 'select object_name from user_objects where object_name ='';
     execute sql into a ;
    if a = 表名 thenelse end if;
    好像是这样,记不太清了
      

  5.   

    照你的意思,其实不用做判断,都先执行DROP好了。
      

  6.   


    create or replace....
      

  7.   

    恩,对象视图中查询该表
    dba_objects等
      

  8.   

    是说table?意思不要drop那个命令了?
      

  9.   

    那删除的时候呢?
    假设有个函数把这个名字占用了 删除的时候要写drop function
    这样判断起来 情况就多了
      

  10.   

    scott@SZTYORA> conn eygle/eygle
    已连接。
    eygle@SZTYORA> create or replace procedure create_tb_proc(v_table varchar2)
      2  Authid Current_User is
      3    v_cnt number(18,0);
      4  begin
      5    select count(1) into v_cnt from user_tables where table_name=upper(v_table);
      6    if v_cnt>0 then
      7     execute immediate 'drop table '||v_table; --这个之前加一个判断,如果表存在则执行这个,不存在就直接执行下一条
      8    end if;
      9    execute immediate 'create table '||v_table||'(a_id number(12) not null)';
     10  end create_tb_proc;
     11  /过程已创建。eygle@SZTYORA> exec create_tb_proc('luoyoumou');PL/SQL 过程已成功完成。eygle@SZTYORA> desc luoyoumou;
     名称                                                                                      是否为空? 类型
     ----------------------------------------------------------------------------------------- -------- -----------------------------
     A_ID                                                                                      NOT NULL NUMBER(12)eygle@SZTYORA> drop table luoyoumou;表已删除。eygle@SZTYORA> create sequence luoyoumou;序列已创建。eygle@SZTYORA> exec create_tb_proc('luoyoumou');
    BEGIN create_tb_proc('luoyoumou'); END;*
    第 1 行出现错误:
    ORA-00955: 名称已由现有对象使用
    ORA-06512: 在 "EYGLE.CREATE_TB_PROC", line 9
    ORA-06512: 在 line 1
      

  11.   

    如果创建临时表的话建议用SESSION,万一程序出错,临时表没有被删除,下次执行的时候也不会出错不规范的操作,后果很严重的。万一这个名字被占用的话,怎么处理?
    DROP 占用名字的那个对象?
    那系统里这个地雷就被引爆了
      

  12.   

    在Oracle中,可以创建以下两种临时表:  
    1.会话特有的临时表  
      CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )  
      ON COMMIT PRESERVE ROWS;  2.事务特有的临时表  
      CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )  
      ON COMMIT DELETE ROWS;  
      默认情况下创建的是事物特有的临时表  
      
      在Oracle中,全局临时表并不会删除,实际上你只需要建立一次,以后直接应用就行了.
      

  13.   

    建表删表还容易引起并发冲突.
    比如一个报表程序中,多人查询同一个报表,那么在别人对表做insert等dml操作时,你是无法删除的,只能等对方事物完毕才能删除,你可以想象效率有多低.而临时表很好的解决了这个问题.
      

  14.   

    产生排它锁的时候使用DROP会直接报错
      

  15.   

    执行DML语句会获得锁select 语句会产生共享锁,insert,delete,update语句会产生排它锁
    排它锁是锁定表的结构与结果集,期间其他用户不能使用DML语句修改表的结果,出现commit或者出现rollback之后锁结束,下面对排它锁举例说明:用户SY,新建用户GYM,实验表zzz给GYM分配下权限
    grant select,insert,update on zzz to GYM表zzz 1条记录yyyymm provid1 zz                 下面用GYM
    update sy.zzz set provid ='1' where yyyymm ='zz'不提交,然后用用户SY
    delete from zzz where yyyymm ='zz'这时,我们发现,delete from zzz where yyyymm ='zz‘这条语句在持续执行,一直未完成。这正是由于用户GYM使用update语句产生排它锁所引起的,这时,提交用户GYM的语句,排它锁解除,发现SY用户的语句执行完成,产生新的排它锁。此时回滚,不提交用户SY语句,查看ZZZ表select yyyymm,provid fromzzzyyyymm providzz          1加入一条记录,重新执行用户GYM语句,此时产生排它锁
    insert into sy.zzz(yyyymm) values('zz1')update sy.zzz set provid ='1' where yyyymm ='zz' 此时UPDATE锁定的数据是yyyymm='zz' 用户sy执行delete from zzz where yyyymm='zz1'发现可以完成,这说明排它锁只锁定DML正在处理的数据,而对于非锁定中的数据,其他用户的依然可以处理排它锁其实就是锁定资源,被锁定的资源不能进行修改truncate,或者DROP table都会出现资源正忙的错误------
    校内日记,凑合着看吧
      

  16.   

    还有,SELECT不产生共享锁,
    共享锁
    lock table 表名 in share mode
      

  17.   

    这个貌似说的是dml语句间的影响.
    有dml操作对ddl操作的描述么?
      

  18.   

    我随便翻翻看到的最后一句基本就是排它锁的意义了吧
    ----
    排它锁其实就是锁定资源,被锁定的资源不能进行修改truncate,或者DROP table都会出现资源正忙的错误
      

  19.   

    共享锁(S锁): 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 排他锁(X锁): 如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 简要说明为什么会发生死锁?解决死锁的主要方法是什么? 若干事务相互等待释放封锁,就陷入无限期等待状态,系统就进入死锁 解决死锁的方法应从预防和解除的两个方面着手: (1)死锁的预防方法:①要求每一个事务必须一次封锁所要使用的全部数据(要么全成功,要么全不成功)②规定封锁数据的顺序,所有事务必须按这个顺序实行封锁。 (2)允许死锁发生,然后解除它,如果发现死锁,则将其中一个代价较小的事物撤消,回滚这个事务,并释放此事务持有的封锁,使其他事务继续运行。 ---
    看这个吧
      

  20.   

    那么临时表的删除和普通表一样的是吗?只是建表和删除放在一起不会冲突?
    还是说,直接对临时表进行delete和insert操作就不删除表了来达到我之前要的效果?
    能说个具体点的例子么?临时表什么场合什么情况用、达到什么效果?
      

  21.   

    同意这位童鞋的观点,先drop掉临时表,用exception捕获异常。然后create临时表
      

  22.   

    临时表对不同session是隔离的.
    也即是说两个session可以同时使用临时表,但是彼此看不到对方的数据,只能看到对方的数据.
      

  23.   

    直接删除是不成的.如果表不存在会报exception的.
      

  24.   

    这个是oracle自己带的还是Java什么的立面的exception?