Ошибка компиляции с процедурой plsql

Ниже приведена процедура plsql, написанная кем-то другим, и я попросил исправить ее ошибки компиляции и запустить ее правильно.

 PROCEDURE DropMyTable IS
  x                number;  
  TYPE cur_typ IS REF CURSOR;
 --type NAME_TBL is table of VARCHAR2(30);
 --tab_Table                 NAME_TBL;
 tab_Table                VARCHAR2S(30);
 stmt                     VARCHAR2(4096);
  stmt2                    VARCHAR2(4096);
    outerCur                 cur_typ;
      rows                     NATURAL := 1000;
    TABLE_DOES_NOT_EXIST     EXCEPTION;
   PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942);
  BEGIN
 stmt2 := 'select distinct G_Tab  from G_SERVE  where G_TYPE=''CAP'''; 
  --Begin
   OPEN outerCur FOR stmt2;
   LOOP
    FETCH outerCur BULK COLLECT INTO
      tab_Table LIMIT rows;
   EXIT WHEN tab_Table.COUNT = 0;

   FOR i IN 1..tab_Table.COUNT LOOP
    --------------------------------------------------------------------
      -- Drop the  tables in G_SERVE.G_TAB
      DBMS_OUTPUT.PUT_LINE('*** Drop  table: ' || tab_Table(i) || ' ***');
      -- BEGIN
      --First drop the optable      
      stmt := 'DROP TABLE ' || tab_Table(i) || '_OPTAB CASCADE CONSTRAINTS';
      DBMS_OUTPUT.PUT_LINE(stmt);
      EXECUTE IMMEDIATE stmt;  
      --drop the base table
      stmt := 'DROP TABLE ' || tab_Table(i) || ' CASCADE CONSTRAINTS';
    DBMS_OUTPUT.PUT_LINE(stmt);
    EXECUTE IMMEDIATE stmt;
      --drop the Package
      stmt := 'DROP PACKAGE  ' || tab_Table(i) || '_PKG';
      DBMS_OUTPUT.PUT_LINE(stmt);
      EXECUTE IMMEDIATE stmt;     
    EXCEPTION
  -- When the table, optab and package  doesn't exist,
  -- ignore error "ORA-00942: table, optab or package does not exist".
   WHEN TABLE_DOES_NOT_EXIST THEN
    DBMS_OUTPUT.PUT_LINE('table, optab or package does not exist');
    DBMS_OUTPUT.PUT_LINE(CHR(9));
   --Re-raises any other errors.
   WHEN OTHERS THEN
   DBMS_OUTPUT.PUT_LINE('Error!');
    RAISE;
     END;
  END LOOP;
 END LOOP;
 --END;
 END DropMyTable;

Сначала я закомментировал 4-ю и 5-ю строчки кода, начиная с самого начала, и изменил его так, как он выглядит сейчас ( 6-я строка сверху).

Другая вещь, которую я закомментировал 2 ключевых слова BEGIN, сначала закомментированные "BEGIN" можно увидеть после

  stmt2 := 'select distinct gao_table  from GAO_SERVICESIFACE  where GAO_TYPE=''CAPABILITY''';

и второе ключевое слово "BEGIN" было закомментировано после следующей строки кода.

 DBMS_OUTPUT.PUT_LINE('*** Drop  table: ' || tab_Table(i) || ' ***');

Так как я подозреваю, что тот, кто написал этот код, поставил ненужное ключевое слово "BEGIN" (извиняюсь, если я ошибаюсь, поскольку я не эксперт по plsql. Но, выполняя все комментарии, я избавился от такого количества ошибок).

Но когда я компилирую приведенный выше код, я все равно получаю следующие 2 ошибки.

1)

ORA-06550: line 27, column 7:
PLS-00103: Encountered the symbol "EXCEPTION" when expecting one of the following:
 ;
 ( begin case declare end exit for goto if loop mod null
 pragma raise return select update while with <an identifier>
 <a double-quoted delimited-identifier> <a bind variable> <<
 continue close current delete fetch lock insert open rollback
 savepoint set sql execute commit forall merge pipe purge  

2)

ORA-06550: line 38, column 9:
PLS-00103: Encountered the symbol "LOOP" when expecting one of the following:
   ;
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

1 ответ

Вы закомментировали BEGIN внутри внутреннего цикла, но не связали его с EXCEPTION и END. Тебе нужно это начать. Также вы не можете изменить массив на скалярную переменную, пока код все еще ожидает массив (ссылки на tab_Table(i) так далее.)

Достойный отступ кода всегда облегчает понимание:

PROCEDURE DropMyTable IS
  x                number;  
  TYPE cur_typ IS REF CURSOR;
  type NAME_TBL is table of VARCHAR2(30);
  tab_Table                 NAME_TBL;
  --tab_Table                VARCHAR2S(30);
  stmt                     VARCHAR2(4096);
  stmt2                    VARCHAR2(4096);
  outerCur                 cur_typ;
  rows                     NATURAL := 1000;
  TABLE_DOES_NOT_EXIST     EXCEPTION;
  PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942);
BEGIN
  stmt2 := 'select distinct G_Tab  from G_SERVE  where G_TYPE=''CAP'''; 
  --Begin
  OPEN outerCur FOR stmt2;
  LOOP
    FETCH outerCur BULK COLLECT INTO
      tab_Table LIMIT rows;
    EXIT WHEN tab_Table.COUNT = 0;

    FOR i IN 1..tab_Table.COUNT LOOP
      --------------------------------------------------------------------
      -- Drop the  tables in G_SERVE.G_TAB
      DBMS_OUTPUT.PUT_LINE('*** Drop  table: ' || tab_Table(i) || ' ***');
      BEGIN
        --First drop the optable      
        stmt := 'DROP TABLE ' || tab_Table(i) || '_OPTAB CASCADE CONSTRAINTS';
        DBMS_OUTPUT.PUT_LINE(stmt);
        EXECUTE IMMEDIATE stmt;  
        --drop the base table
        stmt := 'DROP TABLE ' || tab_Table(i) || ' CASCADE CONSTRAINTS';
        DBMS_OUTPUT.PUT_LINE(stmt);
        EXECUTE IMMEDIATE stmt;
        --drop the Package
        stmt := 'DROP PACKAGE  ' || tab_Table(i) || '_PKG';
        DBMS_OUTPUT.PUT_LINE(stmt);
        EXECUTE IMMEDIATE stmt;     
      EXCEPTION
        -- When the table, optab and package  doesn't exist,
        -- ignore error "ORA-00942: table, optab or package does not exist".
        WHEN TABLE_DOES_NOT_EXIST THEN
          DBMS_OUTPUT.PUT_LINE('table, optab or package does not exist');
          DBMS_OUTPUT.PUT_LINE(CHR(9));
        --Re-raises any other errors.
        WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('Error!');
          RAISE;
      END;
    END LOOP;
  END LOOP;
--END;
END DropMyTable;

Я восстановил это НАЧАТЬ и восстановил массив. Я не знаю, есть ли что-то еще не так.

Другие вопросы по тегам