找了相关资料,都好像只是针对一个表的操作,现在我想在一个存储过程中,用一个循环删除(delete or truncate)多个有一个规则的用户表(A_table1,A_table2...),并且有异常的处理机制或回滚,有路过的大虾请赐教一下啊!

解决方案 »

  1.   

    拼字符串  execute immediate 执行http://www.cnblogs.com/huanghai223/archive/2011/06/29/2093660.html
      

  2.   

    我知道execute immediate 可以执行单个表的操作,但对于多个表呢?如何拼字符串?
      

  3.   


    --Oracle Code
    --建议你把这些表明存储到一个表里面
    create or replace procedure updatetable
    begin
         cursor tp_cur is select 表名 from 存储表名的表;
    tp_sql varchar2(400);
            for lp_cur in tp_cur loop
                    dbms_output.put_line('now begin deleting table '||lp_cur.table_name);
                    tp_sql:='delete '||lp_cur.table_name||' where col_name....';          _____此处自己更改
                    execute immediate tp_sql;
                    dbms_output.put_line('finish deleting table '||lp_cur.table_name);
                    commit;
            end loop;
    end;
      

  4.   

    --要回滚的话 你在 我写的commit处 加判断
    --查询要删除的这些表的表名的时候 你自己加判断
      

  5.   

    还不是很清楚,能不能针对truncate table讲详细一点,最好有一些注释
      

  6.   


    truncate 是不能回滚的与delete的区别 http://www.2cto.com/database/201109/105313.html
      

  7.   

    这个我知道,回滚是针对delete语句,就没有人给一个完整一点的吗?我是刚学习存储过程啊!
      

  8.   


    create or replace procedure proc_DealTables
    as
      sSql varchar2(2000);
      cursor c1 is  select Object_name from user_objects where Object_type='TABLE' ;--and otherswhere; 查询出你要删除的表名
    begin
      for c2 in c1 loop
        sSql := ' delete from '||c2.table_name;
        begin
          execute immediate sSql;
        exception
          when others then
            rollback;
        end;
      end loop;
      
    end;
      

  9.   

    谢谢啦,还能不能详细点,我的表是:用户表(A_table1,A_table2...),通过模糊查询,然后用truncate来删,请大侠提供SQL
      

  10.   

    谢谢啦,还能不能详细点,我的表是:用户表(A_table1,A_table2...),通过模糊查询,然后用truncate来删,请大侠提供SQL
      

  11.   

    truncate 是把表数据都清空了,而且回滚不便。还是老实的用 delete 吧。另外,删除一张表、多张表 没什么区别。 一条一条执行就是了,最多加个事务、回滚点之类的。
    从业务上考虑,先标识(需要删除的数据),最后统一删除,更保险些。
      

  12.   

    它们都有不同的应用场景吧,有些时候你必须要用truncate的,数据太大了,而且你已经备份好所有数据了,
    我向请问下:如何使用cursor进行循环取值-表的名称,然后用truncate来删除每个表的数据。谢谢!
      

  13.   

    都没明白我的意思,就乱引用别人的话,我是不知道cursor的使用啊,如何嵌套,如何拼装SQL语句,请大侠指点。
      

  14.   

    表能随便的drop,truncate么?
    把你所要删除的表放到一个配置表中,写个存储过程,开游标将表名一个一个的带出来,动态语句删除
      

  15.   


    select 'truncate table'||table_name||','
    from user_tables
    where .......导出到csv
    用txt打开复制到commande窗口执行
      

  16.   


    8楼正是你想要的东西!!仔细看看吧,楼主,只不过里面没有commit