大家救救我吧,我的存储过程出现了个奇怪的编译错误create or replace procedure SaveStock2 as
begin         insert into  tf_test  select * from(select tf2.*,row_number()over(partition by stock_id order by cjdate desc) rn from tf2 ) where rn<=1         commit;
         exception
                     when    others    then
                     rollback;
                     dbms_output.put_line(SQLERRM);end;在执行下面这段的时候出现Compilation errors for PROCEDURE IPTV.SAVESTOCK2Error: PLS-00103: 出现符号 "("在需要下列之一时:
       ,from
Line: 5
Text: insert into  tf_test  select * from(select tf2.*,row_number()over(partition by stock_id order by cjdate desc) rn from tf2 ) where rn<=1

解决方案 »

  1.   

    我试过在单独执行insert into  tf_test  select * from(select tf2.*,row_number()over(partition by stock_id order by cjdate desc) rn from tf2 ) where rn <=1 这句话的时候又没有错误,可是加到存储过程中就出错了,而将列row_number()over(partition by stock_id order by cjdate desc) rn 删除的话就不会出错,可见问题出在那个函数上面,但是本人又需要分组排序后取第一条记录,这个sample是项目中的出错存储过程简化而来的,好像是存储过程中不能用oracle分页函数还是怎么的?我都快疯掉了,事关项目进程,麻烦有知道原因的大哥告知一声,本人在此先谢过了!
      

  2.   

    还是自己解决了这个问题,改为动态sql就好了如下:有遇到此类问题的朋友可以参考一下,另还有什么更好的解决办法或者这个问题的深层分析,本人也十分欢迎create or replace procedure SaveStock2 as 
    str_sql varchar2(500);
    begin         str_sql:=' insert into  tf_test  select * from(select tf2.*,row_number()over(partition by stock_id order by cjdate desc) rn from tf2 ) where rn <=1';
            execute immediate str_sql;
             commit; 
             exception 
                         when    others    then 
                         rollback; 
                         dbms_output.put_line(SQLERRM); end;
      

  3.   

    嗬嗬,insert语句后面少了一个分号。
      

  4.   

    Croatia 你的确发现了一个问题,重点不在这里呀,少分号是本人在提供sample的时候弄错了正常的语句 应该是有分号的,
    但是还是会出现编译的错误