2012-05-31 5 views
3

У меня есть следующий PL/SQL:таблица падения, если он существует

declare 
    i_cnt number; 
begin 
    select count(1) into i_cnt 
     from dba_tables 
    where table_name = upper('foo') 
     and owner = upper('bar'); 

if i_cnt > 0 then 
    drop table foo; -- <--- error this line 
end if; 
end; 

Из которого я получаю эту ошибку.

ORA-06550: line 6, column 5: 
PLS-00103: Encountered the symbol "DROP" when expecting one of the following: 

    (begin case declare 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 

Как я могу отказаться от таблицы в процедуре?

+0

Смотри также: http://stackoverflow.com/questions/1799128/ oracle-if-table-exists/1801453 –

ответ

10

Вы не можете непосредственно выполнять операторы DDL из а/SQL блока PL - вы должны будете использовать EXECUTE IMMEDIATE вместо:

declare 
    i_cnt number; 
begin 
    select count(1) into i_cnt 
    from dba_tables where table_name=upper('foo') and owner=upper('bar'); 
    if i_cnt > 0 then 
    execute immediate 'drop table foo'; 
    end if; 
end; 
+0

Можно ли комбинировать оператор 'select' и' if' в одной строке? Мне нужно сделать это для многих таблиц, поэтому я хочу сохранить некоторую типизацию. –

+1

Вы говорите, что вам нужно сделать это для многих таблиц. Можете ли вы охарактеризовать список таблиц на основе критериев в отношении DBA_TABLES? Другими словами, можете ли вы написать запрос к DBA_TABLES и указать соответствующее предложение WHERE, в котором будут перечислены все таблицы, которые вы хотите удалить? Если это так, вы можете написать цикл курсора и выполнить немедленное падение цикла в цикле, указав переменную bind и loop throug, чтобы удалить все таблицы, которые вы хотите удалить. –

+0

@ Марк Дж. Бобак, хорошая идея! Я уже делаю это так для грантов. не мог знать, почему это не делалось для таблиц и последовательностей. :) –

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