2014-11-26 3 views
-1

У меня возникли проблемы с получением ошибок ORA-00942, так как таблица не существует. Это правда, что нет, но до того, как я получаю ошибки, он должен создать таблицу, если она не существует. Таким образом, когда он попадает в тот момент, таблица должна быть там:Ошибка ORA-00942, таблица будет создана

BEGIN 
    SELECT COUNT(*) INTO tCount 
    FROM user_tables 
    WHERE table_name='MY_TABLE'; 
    IF tCount=0 THEN 
    EXECUTE IMMEDIATE 'CREATE TABLE MY_TABLE 
     (T_ID NUMBER(38,0), 
     T_DATE DATE, 
     T_COUNT NUMBER(38,0), 
     CONSTRAINT MY_TABLE_pk PRIMARY KEY (T_ID,T_DATE))'; 
    END IF; 

    LOOP 
    FOR idx IN 1 .. CursorTable.COUNT LOOP 
     SELECT COUNT(*) INTO pk_check 
     FROM MY_TABLE 
     WHERE T_ID=CursorTable(idx).T_ID AND T_DATE=CursorTable(idx).T_DATE; 
     IF (pk_check=0) THEN 
     INSERT INTO MY_TABLE 
      (T_ID, 
      T_DATE, 
      T_COUNT) 
     VALUES 
      (CursorTable(idx).T_ID, 
      CursorTable(idx).T_DATE, 
      CursorTable(idx).T_COUNT); 
     END IF; 
    END LOOP; 
    END LOOP; 
END; 
/
+0

Откуда Вы знаете, что tcount 0? – OldProgrammer

+1

Ваш код не будет компилироваться, если таблица не существует. Примените EXECUTE IMMEDIATE на счету SELECT ... и INSERT. – Multisync

+0

Возможный дубликат [EXECUTE IMMEDIATE Таблица temp в oracle не создается ORA-00942] (http://stackoverflow.com/questions/26212557/execute-immediate-temp-table-in-oracle-does-not-get- сотворен ор-00942) – user272735

ответ

0

У вас есть эта проблема, потому что ваше создание таблицы, а затем последующий отбор (LOOP) находится внутри того же оператора BEGIN ... END блока.

Инструкция BEGIN отличается от использования ключевого слова BEGIN, которое запускает инструкцию BEGIN ... END. Последнее не вызывает неявного фиксации. (http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html)

Попробуйте переместить выделение (LOOP) за пределы BEGIN..END, и оно должно работать.

Смежные вопросы