Создание таблицы, если она еще не существует - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать таблицу, если она еще не существует.В настоящее время я проверяю, существует ли он сначала в DBA_TABLES, и если этот запрос ничего не возвращает, вставьте.Есть ли способ просто проверить одно и то же утверждение, чтобы мне не приходилось разбивать его на отдельные запросы?

Это то, что у меня сейчас.

BEGIN
    SELECT COUNT(*)
    INTO lvnTableExists
    FROM DBA_TABLES
    WHERE Table_Name = 'SOME_TABLE';

    IF lvnTableExists = 0 THEN
        EXECUTE IMMEDIATE 'CREATE TABLE SOME_TABLE AS (SELECT * FR0M OTHER_TABLE)';
    END IF;
END;

Это что-точто я собираюсь.

DECLARE
    sql VARCHAR2(100000);
BEGIN
    sql := 'CREATE TABLE SOME_TABLE ' ||
            'AS (SELECT * FROM OTHER_TABLE) ' ||
            'WHERE NOT EXISTS (SELECT NULL ' ||
            'FROM DBA_OBJECTS d WHERE d.Object_Name = 'SOME_TABLE' AND ' ||
            'd.Owner = 'SOME_TABLE')';
    EXECUTE IMMEDIATE sql;
END;

Проблема в том, что вы не можете поместить WHERE NOT EXISTS в оператор CREATE TABLE AS.

1 Ответ

0 голосов
/ 30 мая 2018

Да, это действительно позор, что у Oracle нет такой функциональности.Я уверен, что это придет когда-нибудь.До тех пор, если вы хотите написать оболочку PL / SQL, почему бы не сделать это так:

DEClARE
     table_exists_already exception; 
     pragma exception_init(table_exists_already, -955 ); 
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE SOMETABLE...';
EXCEPTION WHEN table_exists_already THEN
  DBMS_OUTPUT.PUT_LINE('Table sometable already exists');
END;
/
...