ORA-06550 при попытке проверить, существует ли таблица
Я хотел бы проверить, существует ли таблица перед ее созданием в базе данных Oracle. Хотя следующее утверждение не работает, выбрасывая ошибку ORA-06550 в строке 7 (CREATE).
DECLARE cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) = lower('TestTable');
IF( cnt = 0 )
THEN
CREATE TABLE TestTable
(
TestFlag NUMBER(1) NOT NULL
);
END IF;
END;
Может кто-нибудь помочь мне с этим?
Заранее спасибо!
3 ответа
Решение
Создание таблиц на лету в Oracle - это большое "нет-нет", поэтому, если это реальный код, который вы запускаете, остановитесь. вместо этого используйте временные таблицы. но причина сбоя заключается в том, что DDL должен запускаться на SQL, а не на PL/SQL.
DECLARE cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) = lower('TestTable');
IF( cnt = 0 )
THEN
execute immediate 'CREATE TABLE TestTable (testFlag NUMBER(1) NOT NULL)';
END IF;
END;
Лично я не вижу никаких причин, почему вы хотите создать таблицу таким образом, но вот другой подход к созданию таблицы, если она не существует:
SQL> declare
2 table_exists exception;
3 pragma exception_init(table_exists, -955);
4 begin
5 execute immediate 'create table TestTable(TestFlag number(1) not null)';
6 dbms_output.put_line('table created');
7 exception
8 when table_exists
9 then dbms_output.put_line('table exists');
10 end;
11 /
table created
SQL> declare
2 table_exists exception;
3 pragma exception_init(table_exists, -955);
4 begin
5 execute immediate 'create table TestTable(TestFlag number(1) not null)';
6 dbms_output.put_line('table created');
7 exception
8 when table_exists
9 then dbms_output.put_line('table exists');
10 end;
11 /
table exists
PL/SQL procedure successfully completed
DECLARE cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name)
= lower('TestTable');
IF( cnt = 0 )
THEN
EXECUTE IMMEDIATE 'CREATE TABLE TestTable ( TestFlag NUMBER(1) NOT NULL )';
END IF;
END;