alter table mytable delete('col' );

解决方案 »

  1.   

    对存储过程不能直接用alter table mytable delete('col' );
    可以这样:
    create or replace procedure P_sjzl   is
    vl_sql string(300);
    begin
       vl_sql:=alter table mytable delete('+col+');
       execute immediate vl_sql;
       commit;
    end;
      

  2.   

    对存储过程不能直接用alter table mytable delete('col' );
    可以这样:
    create or replace procedure P_sjzl   is
    vl_sql string(300);
    begin
       vl_sql:='alter table mytable delete('+'col'+')';
       execute immediate vl_sql;
       commit;
    end;
      

  3.   

    谢谢,但我的要求
    写一个总的(包括sum(列)=0),不只是删除列的
      

  4.   

    declare
    cursor t_sor is
    select COLUMN_NAME from user_tab_columns 
    where upper(TABLE_NAME)=upper('toparcelcollect') and  DATA_TYPE='NUMBER' order by COLUMN_ID;
    type p_sor is ref cursor;
    v_sor p_sor;
    str varchar2(50);
    v_num number;
    begin
    for r_sor in t_sor loop
    str:='select '||sum(r_sor.column_name)||' num from toparcelcollect';
    open v_sor for str;
    fetch v_sor into v_number;
    dbms_output.put_line(v_number);
    if v_number=0 then
    alter table toparcelcollect drop column r_sor.column_name;
    end if;
    close v_sor;
    end loop;
    end;还没认真测试!自已试看吧。
      

  5.   

    存储过程中不支持:DDL语句,所以楼上朋友所说的不一定正确.
    请问帖主,为什么一定要删除列呢,这样做很不正规也不规范.
    如果真的需要动态数据库表,不如将横表改为竖表,这样删除记录就等于删除列了.
      

  6.   

    那只好修改为动态执行:str:='alter table toparcelcollect drop column '||r_sor.column_name;
    execute immediate str;但执行此句先赋予权限。 grant alter any table to user_name;
      

  7.   

    减少输出的空白
    beckhambobo(beckham) 的方法是可行的,谢谢
      

  8.   

    这样做很不规范,
    而且这样做也没有必要执行commit
     beckhambobo(beckham) 的是不能放到存储过程中的