declare 
      v_sql varchar2(500):=&请你输入;
      p_cursor datatype.P_cursor;
      begin
        v_sql:='select * from (select A.*,rownum r_id from ('||v_sql||') A where rownum<=5) B where B.r_id>=1';
        dbms_output.put_line(v_sql);
        open p_cursor for v_sql;
        for i in p_cursor
         loop
           dbms_output.put_line(i.deptno||'---'||i.dname||'---'||i.loc);
         end loop;
      end;

解决方案 »

  1.   

     B.r_id>=1这个没有意义啊
      

  2.   

    运行时,传递一个'select * from dept'参数,运行错误!
      

  3.   

    v_sql:='select * from (select A.*,rownum r_id from (' ¦ ¦v_sql ¦ ¦') A where rownum <=5) B where B.r_id>=1'换个名字吧
      

  4.   

    select A.*,rownum r_id from (' ¦ ¦v_sql ¦ ¦') 
      

  5.   

    需要明白,for是隐含open/close cursor的,所以要用open cursor,就只能用loop/fetch
    试试下面的plsql:declare
      type refcursor is ref cursor;
      p_cursor refcursor;
      l_deptno varchar2(200);
      l_dname varchar2(200);
      l_loc varchar2(200);
      v_sql    varchar2(500) := '&请你输入';
    begin
      v_sql := 'select deptno,dname,loc from (select A.*,rownum r_id from (' || v_sql ||
               ') A where rownum <=5) B where B.r_id>=1';
      dbms_output.put_line(v_sql);
      open p_cursor for v_sql;
      loop
        fetch p_cursor
          into l_deptno,l_dname,l_loc;
        exit when p_cursor%notfound;
        dbms_output.put_line(l_deptno || '---' || l_dname || '---' || l_loc);
      end loop;
    end;
    /
      

  6.   

    declare 
          v_sql varchar2(500):=&请你输入; 
          p_cursor datatype.P_cursor; 
          begin 
            v_sql:='select * from (select A.*,rownum r_id from (' ¦ ¦v_sql ¦ ¦') A where rownum <=5) B where B.r_id>=1'; 
            dbms_output.put_line(v_sql); 
            open p_cursor for v_sql; 
            for i in p_cursor 
            loop 
              dbms_output.put_line(i.deptno ¦ ¦'---' ¦ ¦i.dname ¦ ¦'---' ¦ ¦i.loc); 
            end loop; 
          end;
    &请你输入需要更改成'&请你输入'
      

  7.   

    v_sql 换个名字,还有就是在动态的SQL中,两个单引号才表示一个双引号,第一个作为转义用。