2017-01-25 3 views
2

У меня есть вопрос относительно ORACLE, я написал КОД PLSQL, который проверяет, если таблица существует, если она существует, то я выбираю что-то из этого table..pseudocode, как:Выберите из таблицы, которая не существует

если (таблица существует) Выберите из таблицы, где ....

проблема заключается в том, что я всегда получаю сообщение об ошибке, если таблица не существует, даже если условие if никогда не выполняется, и оператор select никогда не выполняется.

Я думаю, это потому, что мой код проверяется во время компиляции: «выберите из ..», а затем он печатает ошибку, если таблица не существует. Как я могу решить такой вопрос .. вот как мой код выглядит следующим образом (я использовал родовые имена):

 DECLARE 
      v_table_exists NUMBER; 
     BEGIN 

      SELECT NVL(MAX(1), 0) 
      INTO v_table_exists 
      FROM ALL_TABLES 
      WHERE TABLE_NAME = 'TABLE_TEST'; 

      IF v_table_exists = 1 THEN 
      INSERT INTO MY_TABLE(COLUMN1, COLUMN2, COLUMN3, COLUMN4) 
      SELECT 1234, 
        5678, 
        T.COLUMN_TEST1, 
        T.COLUMN_TEST2 


    FROM TABLE_TEST T 
      WHERE T.FLAG = 1; 
     END IF; 
    END; 
+0

Возможная Дубликат [Использование SQL запрос, чтобы определить, является ли таблица существует] (http://stackoverflow.com/questions/4385346/using-sql-query-to- define-if-a-table-exists) – Midwire

+0

Я отредактировал свой вопрос, разместил пример – NoName123

ответ

6

Вопрос именно в том, что ваша процедура жулик не может быть скомпилирован как это относится к несуществующий объект; для этого может потребоваться некоторый динамический SQL; например:

create or replace procedure checkTable is 
    vCheckExists number; 
    vNum   number; 
begin 
    -- check if the table exists 
    select count(1) 
    into vCheckExists 
    from user_tables 
    where table_name = 'NON_EXISTING_TABLE'; 
    -- 
    if vCheckExists = 1 then 
     -- query the table with dynamic SQL 
     execute immediate 'select count(1) from NON_EXISTING_TABLE' 
     into vNum; 
    else 
     vNum := -1; 
    end if; 

    dbms_output.put_line(vNum); 
end; 

Процедура компиляции, даже если таблица не существует; если вы звоните сейчас, вы получите:

SQL> select count(1) from NON_EXISTING_TABLE; 
select count(1) from NON_EXISTING_TABLE 
        * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> exec checkTable; 
-1 

PL/SQL procedure successfully completed. 

Затем, если вы создаете таблицу и вызвать процедуру снова:

SQL> create table NON_EXISTING_TABLE(a) as select 1 from dual; 

Table created. 

SQL> exec checkTable; 
1 

PL/SQL procedure successfully completed. 

Точно так же я показал SELECT, вы можете сделать UPDATE или любой SQL-запрос, который вам нужен; если вы делаете что-то отличное от SELECT, необходимо снять пункт INTO.

Например, говорят, что нужно вставить в другую таблицу, приведенный выше код должен быть изменен таким образом:

if vCheckExists = 1 then 
    execute immediate 'insert into target(a, b, c) select a, 1, 100 from NON_EXISTING_TABLE'; 
end if; 
+0

Можете ли вы посмотреть на мой пример (я редактирую свой вопрос) .. Поэтому мне нужно написать весь оператор с немедленным выполнением. – NoName123

+0

Да, весь INSERT .. SELECT .... Просто покажу пример. – Aleksej

0

Согласно this article, в Oracle Database Server статический SQL действительно проверяется во время компиляции обеспечить наличие ссылочных объектов.

Поэтому я рекомендую использовать динамический SQL вместо статического SQL, например, с помощью varchar.

+0

Можете ли вы посмотреть на мой пример? Так что мне нужно написать весь мой ЗАЯВЛЕНИЕ INSERT INTO в EXECUTE IMMEDIATE («МОЕ ЗАЯВЛЕНИЕ»)? – NoName123

1

Все должно быть выполнено в Dynamic SQL (DBMS_SQL) или EXECUTE_IMMEDIATE, иначе ваш код никогда не будет компилироваться (или пакет будет недействителен), если таблица не существует.

DBMS_SQL Пример

EXECUTE_IMMEDIATE Пример

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