我的database 為win2000+oracle8i,現在我創見一個procedure居然出錯
procedure source:
-------------------------------------------
CREATE Procedure ON_LINE_DBBK is
 CURSOR C1 IS
  SELECT TABLESPACE_NAME FROM DBA_TABLESPACES
   WHERE TABLESPACE_NAME LIKE '%'
   ORDER BY TABLESPACE_NAME ASC;
 CURSOR C2(V_TABLESPACE IN VARCHAR2) IS
   SELECT FILE_NAME FROM DBA_DATA_FILES
    WHERE TABLESPACE_NAME = V_TABLESPACE
    ORDER BY FILE_NAME ASC;
BEGIN
   begin
       dbms_output.put_line('echo Begin backup database...');
       dbms_output.put_line('host date/t');
       dbms_output.put_line('host time/t');       FOR C1_REC IN C1 LOOP
         dbms_output.put_line('alter tablespace '||c1_rec.tablespace_name||' begin backup;');
         for c2_rec in c2(c1_rec.tablespace_name) loop
            dbms_output.put_line('host copy'||c2_rec.file_name||' e:\back\hrmtest');
         end loop; ---c2
         dbms_output.put_line('alter tablespace '||c1_rec.tablespace_name||' end backup;');
       END loop; ---c1
      dbms_output.put_line('echo End backup database...');
      dbms_output.put_line('host date/t');
      dbms_output.put_line('host time/t');
     end;
END; -- on_line_dbbk
-----------------------
errors:
(1):PLS-00201: identifier 'SYS.DBA_TABLESPACES' must be declared
(2):PL/SQL: SQL Statement ignored
(3):PLS-00201: identifier 'SYS.DBA_DATA_FILES' must be declared
(4):PL/SQL: SQL Statement ignored
(5):PLS-00364: loop index variable 'C1_REC' use is invalid
(6):PL/SQL: Statement ignored
(7):PLS-00364: loop index variable 'C1_REC' use is invalid
(8):PL/SQL: Statement ignored
(9):PLS-00364: loop index variable 'C1_REC' use is invalid
(10):PL/SQL: Statement ignored
--------------------------
其中我用一般的sql語句處理
  SELECT TABLESPACE_NAME FROM DBA_TABLESPACES
   ORDER BY TABLESPACE_NAME ASC    成功
請問原因是什麼.

解决方案 »

  1.   

    我直接執行以下的語句就可以,為什麼?
    declare
     CURSOR C1 IS
      SELECT TABLESPACE_NAME FROM DBA_TABLESPACES
       WHERE TABLESPACE_NAME LIKE '%'
       ORDER BY TABLESPACE_NAME ASC;
     CURSOR C2(V_TABLESPACE IN VARCHAR2) IS
       SELECT FILE_NAME FROM DBA_DATA_FILES
        WHERE TABLESPACE_NAME = V_TABLESPACEd
        ORDER BY FILE_NAME ASC;
    BEGIN
       begin
           dbms_output.put_line('echo Begin backup database...');
           dbms_output.put_line('host date/t');
           dbms_output.put_line('host time/t');       FOR C1_REC IN C1 LOOP
             dbms_output.put_line('alter tablespace '||c1_rec.tablespace_name||' begin backup;');
             for c2_rec in c2(c1_rec.tablespace_name) loop
                dbms_output.put_line('host copy'||c2_rec.file_name||' e:\back\hrmtest');
             end loop; ---c2
             dbms_output.put_line('alter tablespace '||c1_rec.tablespace_name||' end backup;');
           END loop; ---c1
          dbms_output.put_line('echo End backup database...');
          dbms_output.put_line('host date/t');
          dbms_output.put_line('host time/t');
         end;
    END;
    /