2017-02-07 10 views
1

мне нужно удалить таблицу, только если таблица существует, может сделать это с помощью PLSQL блокападение стола, имеющее имя: <table_name> _ (SYSDATE-1) только если таблица существует

BEGIN 
    EXECUTE IMMEDIATE 'DROP TABLE <table_name>; 
EXCEPTION 
    WHEN OTHERS THEN 
      IF SQLCODE != -942 THEN 
       RAISE; 
      END IF; 
END 

Но в моем случае имя таблицы имеет sysdate (02062017), например table001_02072017, и мне нужно удалить все такие таблицы с помощью sysdate-1. Как я могу это сделать?

+0

Почему вам нужно удалить таблицу, только если она существует? Как вы думаете, что произойдет, если вы отбросите стол, а его нет? – mathguy

+0

Мне нужно отбросить стол, только если он существует. – Mishti

+0

Это не отвечает на мой вопрос. ПОЧЕМУ вам нужно отказаться от нее *, только если она существует *? Как вы думаете, что плохо, если вы отбросите таблицу, которая не существует? – mathguy

ответ

1

Вы можете найти таблицу с заданным рисунком из таблицы слова и цикла на результат, чтобы отбросить каждый по одному.

begin 
    for t in (select table_name from user_tables 
      where table_name like '%\_'||to_char(sysdate-1,'mmddyyyy') escape '\') 
    loop 
    execute immediate 'drop table ' || t.table_name; 
    end loop; 
exception 
    /* Handle your exceptions here. */ 
end; 
/

Использование WHEN OTHERS в вашей обработки исключений не рекомендуется. Вы должны явно обрабатывать ошибки.

+2

'исключение, когда другие тогда ...'? Пожалуйста, не поощряйте плохие практики! – mathguy

+0

Спасибо GurV, он работал – Mishti

+1

@mathguy, ну, вы можете сделать «исключение, когда другие тогда ...», чтобы отобразить сообщение об ошибке в более понятном формате, а затем повторно поднять ошибку. Я думаю, что есть статья об AskTom об этом. –

0

Dynamic SQL поможет здесь просто использовать

execute immediate 'drop table ' || table_name;

внутри вашей процедуры