小弟在Pro*c中写了一个PL/SQL块,里面有一个光标操作,且 test1表已经定义。如下:int main( int ac, char **av )
{
     connectDB();
     
     EXEC SQL EXECUTE
          DECLARE 
         CURSOR my_cur IS (SELECT * FROM test1 );
  BEGIN
      FOR onerec IN my_cur LOOP
                  DBMS_OUTPUT.PUT_LINE( onerec.id || '    '  ||  onerec.name );
      END LOOP;
          END;     END-EXEC;      EXEC SQL COMMIT WORK RELEASE ;     return 0;  
}可是当编辑完预编译的时候却总是出现错误,错误信息如下:Pro*C/C++: Release 10.1.0.3.0 - Production on Mon Jul 21 00:14:34 2008Copyright (c) 1982, 2004, Oracle.  All rights reserved.System default option values taken from: /home/oracle/precomp/admin/pcscfg.cfgError at line 29, column 49 in file t6.pc
              CURSOR my_cur IS (SELECT * FROM test1 );
................................................1
PLS-S-00201, identifier 'TEST1' must be declared
Error at line 29, column 28 in file t6.pc
              CURSOR my_cur IS (SELECT * FROM test1 );
...........................1
PLS-S-00000, SQL Statement ignored
Error at line 32, column 47 in file t6.pc
                      DBMS_OUTPUT.PUT_LINE( onerec.id || '    '  ||  onerec.name
 );
..............................................1
PLS-S-00364, loop index variable 'ONEREC' use is invalid
Error at line 32, column 19 in file t6.pc
                      DBMS_OUTPUT.PUT_LINE( onerec.id || '    '  ||  onerec.name
 );
..................1
PLS-S-00000, Statement ignored
Semantic error at line 28, column 11, file t6.pc:
          DECLARE 
..........1
PCC-S-02346, PL/SQL found semantic errors我就不明白了,test1表我明明定义了啊,为什么还提示我“identifier 'TEST1' must be declared”?还有PLS-S-00364, loop index variable 'ONEREC' use is invalid这个错误是怎么回事呢?谢谢

解决方案 »

  1.   

    你定义了显式游标,调用的时候却用隐式游标的方式调用。int main( int ac, char **av ) 

        connectDB(); 
        
        EXEC SQL EXECUTE 
              DECLARE 
            CURSOR my_cur IS (SELECT * FROM test1 ); 
      BEGIN 
          -- 显式游标:
          open my_cur;
          fetch my_cur;
          while my_cur%found loop
              ...
          end loop;
          close my_cur;      -- 或者用隐式游标实现
          -- for x in (SELECT * FROM test1 ) loop
          --  ...
          -- end loop;    END;     END-EXEC;     EXEC SQL COMMIT WORK RELEASE ;     return 0;  

      

  2.   

    不是这个原因吧书上有下面这段PL/SQL程序:DECLARE 
       CURSOR my_cur IS (SELECT * FROM TEST1);
    BEGIN
       FOR v_row IN my_cur
       LOOP
           DBMS_OUTPUT.PUT_LINE(v_row.name);
       END LOOP;
    END;我在PL/SQL developer上运行上面的程序没问题啊
      

  3.   


    你说的对,是可以这么执行的。呵呵,是我没见过,不好意思啊。lz 确定connectdb()里的用户与建test1表的是同一个用户吗?
      

  4.   

    在proc中这么没见过,但可以用以下方式:
    EXEC SQL BEGIN DECLARE SECTION;
       char       sql[1000];
       struct     *stru_temp
    EXEC SQL END DECLARE SECTION;sql="你的语句";
    EXEC SQL PREPARE psql from :sql;
    if(sqlca.sqlcode!=0)
        printf(" prepare faluse,sqlcode=%d\n",sqlca.sqlcode);
    EXEC SQL DECLARE csql1 CURSOR FOR psql;
    EXEC SQL OPEN csql1;
    while (sqlca.sqlcode==0 || sqlca.sqlcode==1403)
    {
           EXEC SQL FETCH csql1 INTO :stru_temp;
    }
    EXEC SQL CLOSE csql1;