存储过程如下:
CREATE OR REPLACE PROCEDURE p_test 
    is
        TYPE t_rec_date IS TABLE OF raw_data.stock_date%type INDEX BY BINARY_INTEGER; 
        TYPE t_ref_cursor IS REF CURSOR; 
        v_cur t_ref_cursor;
        v_sql string(2000);
        v_stock_date date;
    begin
        v_sql := 'select stock_date from raw_data';
        open v_cur for v_sql;  
     loop  
        fetch v_cur into v_stock_date; 
        exit when v_cur%notfound; 
        end loop;
        close v_cur;
end p_test;报的是"open v_cur for v_sql;"这行有错,错误如下:
PROCEDURE P_TEST 出现错误:LINE/COL ERROR
-------- -----------------------------------------------------------------
11/2     PLS-00103: 出现符号 ""在需要下列之一时:
         begin case declare end
         exception 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
         <a single-quoted SQL string> pipe
奇怪的是,我因为建了两个oracle9i的库,两个库完全一致,一个在公司,一个在家里,在公司运行如上存储过程没有问题,但是在家里运行就报错,区别只是公司我使用的是oracle10g client,而家里使用的是9i的client,难道存储过程的编译和client还有关系?实在搞不懂,请各位大虾指教!!!

解决方案 »

  1.   

    没问题的。
    只是格式排版的问题。
    不信,你把
    open v_cur for v_sql; 
    loop
    这两句删了,重新写一遍,ok。注意:如果用plsql,toad等开发工具的时候,注意关键字的变化,以确定排版格式是否正确。
      

  2.   

    SQL> ed
    已写入 file afiedt.buf  1  CREATE OR REPLACE PROCEDURE p_test
      2      is
      3          TYPE t_ref_cursor IS REF CURSOR;
      4          v_cur t_ref_cursor;
      5          v_sql varchar2(2000);
      6          v_stock_date date;
      7      begin
      8          v_sql := 'select 1 from dual';
      9          open v_cur for v_sql ;
     10          loop
     11          fetch v_cur into v_stock_date;
     12          exit when v_cur%notfound;
     13          end loop;
     14          close v_cur ;
     15* end p_test;
    SQL> /过程已创建。SQL> show err
    没有错误。
    SQL>楼主的语法非常正常,但是空格好像不太对,偶自己敲一遍代码就没问题,copy楼主的代码就有编译错误
      

  3.   


    CREATE OR REPLACE PROCEDURE p_test is
      TYPE t_rec_date IS TABLE OF raw_data.stock_date%type INDEX BY BINARY_INTEGER;
      TYPE t_ref_cursor IS REF CURSOR;
      v_cur        t_ref_cursor;
      v_sql        string(2000);
      v_stock_date date;
    begin
      v_sql := 'select stock_date from raw_data';
      open v_cur for v_sql;
            loop   fetch v_cur
        into v_stock_date;
      exit when v_cur%notfound;
    end loop; close v_cur;
    end p_test;没问题,