我现在有一些procedure名称存在一张表中,比如存在表t_proc的proc_name字段中。每次我都要如下重新编译:
alter procedure sp_branch_level_tbl         compile;
alter procedure sp_fina_business_info       compile;
alter procedure sp_sell_type_tbl            compile;
并且每增加一个procedure,我就要调整我的脚本。我想知道是否有办法直接从t_proc中取出proc_name的列表,然后循环执行。但我不知道这样的动态sql该怎么写?谢谢!

解决方案 »

  1.   

    可以建立一个游标循环你的列名:
    cursor c1 is
     select column_name 
            from all_tab_columns 
          where  table_name=upper('t');然后再对你需要的字段进行操作
      

  2.   

    大家可能没有明白我的意思吧?cursor我当然知道写,一条条记录取出来。
    我现在的需求是这样的:我系统里面所有的procedure都存在一张表中,因为每晚导数据,将一些表先删除,然后再导入,这样就会造成这些procedure失效,所以我想在导数完成后,重新编译这些procedure,现在我是一个个procedure都列出来recompile,但我们的需求会变化,经常会增加一些procedure,每次增加都会将procedure的名称存入那张表中。现在因为我是一个个procedure列出来recompile,所以每次增加,我就要调整这个recompile的脚本,我现在想通过cursor从这张表中取,每取出一个procedure的名称,就recompile,现在我不知道该如何事先,所以请教大家。
      

  3.   


    begin
      for recpro in (select proc_name from t_proc) 
      loop
        execute immediate 'alter procedure ' || recpro.proc_name  || ' compile';
      end loop;
    end;
      

  4.   

    你可以直接取得存储过程的列表,不必另存表吧
    SELECT   
        A.OBJECT_NAME   
      FROM   
      SYS.ALL_OBJECTS   A   
      WHERE   (A.OWNER   =   '用户名')   
      AND   (A.OBJECT_TYPE   =   'PROCEDURE') 
    然后对这个列表编译就可以了吧
      

  5.   

    注意:用户名一般用大写,或者用upper函数转一下
      

  6.   

    to linzi:
    你这个方法没有问题,但是好像无法得到每个procedure执行结果的log。有没有办法得到呢?
      

  7.   

    在user_errors表中可以查到编译错误,每运行完一个,查一下表中的记录