写了下面的语句 
  1   declare
  2   new_name user_source.name%type;
  3   cursor cursor_1
  4   is
  5   select name from user_source;
  6   begin
  7   for myrecord in cursor_1 loop
  8   dbms_output.put_line(myrecord.name);
  9   drop procedure myrecord.name;
 10   end loop;
 11*  end;
 12  /运行出错,错误如下
 drop procedure myrecord.name;
 *
第 9 行出现错误:
ORA-06550: 第 9 行, 第 2 列:
PLS-00103: 出现符号 "DROP"在需要下列之一时:
begin case declare end
exit for goto if loop mod null pragma raise return select
update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
求高手解答

解决方案 »

  1.   

    drop procedure myrecord.name; 改成 execute immediate 'execute immediate';
      

  2.   

    你的意思是说 要使用动态sql来执行DDL语句?
      

  3.   

    不可以直接这么用,也不建议用
    但一定要用有两种方法:动态SQL实现,DBMS_SQL
      

  4.   

    怎样分配动态sql的权限?我找了找没找到啊?
      

  5.   

    execute immediate 'drop procedure'|| myrecord.name;
      

  6.   

    declare
    new_name user_source.name%type;
    cursor cursor_1
    is
    select name from user_source;
    begin
    for myrecord in cursor_1 loop
    dbms_output.put_line(myrecord.name);
    execute immediate 'drop procedure '||myrecord.name;
    end loop;
    end;
      

  7.   

    请参考:DECLARE
        new_name user_source.name%type;
        CURSOR cursor_1 IS SELECT name FROM user_source;
    BEGIN
        FOR myrecord IN cursor_1 LOOP
            dbms_output.put_line(myrecord.name);
            -- 本地动态执行DDL
            EXECUTE IMMEDIATE 'drop procedure '|| myrecord.name;
        END LOOP;
    END;