我的本意是客户端在表plan中插入数据时,数据库这边通过用户插入的数据 作为一个新表的表名,也就是想动态的 创建一个新表。我的想法是 通过触发器调用一个存储过程,在存储过程中实现更新原表和创建新表的功能。但我现在碰到了一个问题,存储过程在创建新表 时编译出错,下面是我存储过程中的代码:
create or replace procedure (v_unit in newplan.unit % type,
    v_year_quarter in newplan.year_quarter % type
    )as
       t_unit newplan.unit % type;
       t_year_quarter  newplan.year_quarter % type;
       t_plan_table_id varchar2(50);
       t_str varchar2(1000);
    begin
      if v_unit = '吐鲁番采油厂' then
         t_unit := 'tulufan';
      elsif  v_unit = '温米采油厂' then
             t_unit := 'wenmi';
      end if;
      
      t_year_quarter := v_year_quarter;
      t_plan_table_id :=upper(t_unit)||'_'||t_year_quarter;
      --t_plan_table_id :='abc'
      UPDATE  NEWPLAN
      SET plan_table_id = t_plan_table_id;
      
      t_str:='create table '|| t_plan_table_id ||'(
              target_tag varchar2(20),
              count_unit varchar2(10),
              quarter    number(1),
              jun_plan   number(10,2),
              feb_plan   number(10,2),
              mar_paln   number(10,2),)';
      EXECUTE IMMEDIATE t_str;------------这里出错了 为什么呢?
       
 end;

解决方案 »

  1.   

    t_str:='create table '|| t_plan_table_id ||'(
                  target_tag varchar2(20),
                  count_unit varchar2(10),
                  quarter    number(1),
                  jun_plan   number(10,2),
                  feb_plan   number(10,2),
                  mar_paln   number(10,2),)';看到没有,你最后多了一个逗号
      

  2.   

    呵呵,
    sasacat(傻傻猫) 
    眼睛亮!!!!!!!!
      

  3.   

    太晕了哈 老眼昏花了 谢谢哈
    我还有个问题 在对newplan进行insert插入的时候 怎么报触发器不能读 的错误啊
    怎么回事呢?
      

  4.   

    to :sasacat(傻傻猫)大虾  现在的问题是触发器里能不能直接调用存储过程呢?
    我触发器里的代码是:
    begin
       pro_create_table(:new.unit,:new.year_quarter);
    end;
     在对newplan进行insert插入unit 和 year_quarter时候,报触发器不能读 的错误
    怎么回事呢?
      

  5.   

    你先试试不要用:new.unit,:new.year_quarter,这样的,直接赋值看能不能运行成功如果不能成功的话,说明触发器里不能调用存储过程。如果能成功,说明你赋值方式不对...我好象模糊的有点印象是不能在触发器里调用存储过程,但记不太清楚,你试试吧
      

  6.   

    呵呵,触发器里不能进行ddl操作,也不能调用存储过程的
    因为触发器的事务完整性不是程序控制回滚的,而是数据库控制的,如果进行了ddl操作,那么在回滚的时候不能完全的回滚
      

  7.   

    谢谢各位了 但我想实现的功能是在newplan表发生insert变化的时候,根据这个变化的数据自动的创建一个新表,我现在已经把创建新表的 过程函数已经写好了。如果不能用 触发器自动调用,还有什么方法可以自动调用呢?各位大虾们 在帮帮忙哈 感激不尽了
      

  8.   

    我最早就是用触发器直接调用的,报错后改用调用过程也还是错,应该是向 xiaoxiao1984(笨猫一只^_^) 说的 触发器里不能有ddl语句。现在 有什么办法能不用人工的干预,由表的insert改动 自动的运行过程呢?我想是否可以写一个job,定时检查表的变动 然后调用过程。但这样太耗系统资源了啊~ 还有没有其他方法呢 ?