Как я могу использовать СОЗДАТЬ ИЛИ ЗАМЕНИТЬ? - PullRequest
89 голосов
/ 17 июня 2009

Правильно ли я понимаю, что CREATE OR REPLACE в основном означает "если объект существует, отбросьте его, а затем создайте в любом случае?"

Если так, что я делаю не так? Это работает:

CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

И это не так (ORA-00922: отсутствует или недействительна):

CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

Я что-то делаю глупо? Кажется, я не могу найти много документации об этом синтаксисе.

Ответы [ 13 ]

0 голосов
/ 22 июня 2017

«Создать или заменить таблицу» невозможно. Как уже говорилось, вы можете написать процедуру и / или использовать команду begin execute немедленно (...). Поскольку я не вижу ответа о том, как (повторно) создать таблицу, я поставил сценарий в качестве ответа.

PS: в соответствии с тем, что упомянул Джеффри-Кемп: этот скрипт не будет сохранять данные, которые уже присутствуют в таблице, которую вы собираетесь удалить. Из-за риска потери данных в нашей компании разрешено изменять только существующие таблицы в производственной среде, а также удалять таблицы. Воспользовавшись выпиской из дроп-таблицы, рано или поздно вы получите полицейского компании, стоящего у вас на столе.

--Create the table 'A_TABLE_X', and drop the table in case it already is present
BEGIN
EXECUTE IMMEDIATE 
'
CREATE TABLE A_TABLE_X
(
COLUMN1 NUMBER(15,0),
COLUMN2  VARCHAR2(255 CHAR),
COLUMN3  VARCHAR2(255 CHAR)
)';

EXCEPTION
WHEN OTHERS THEN
  IF SQLCODE != -955 THEN -- ORA-00955: object name already used
     EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X';
  END IF;
END;
0 голосов
/ 08 июня 2017

Так что я использовал это, и оно работало очень хорошо: - оно работает больше как DROP IF EXISTS, но выполняет свою работу

DECLARE
       VE_TABLENOTEXISTS EXCEPTION;
PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942);


    PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS
              VS_DYNAMICDROPTABLESQL VARCHAR2(1024);
                    BEGIN
                       VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME;  
                    EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL;

                    EXCEPTION
                        WHEN VE_TABLENOTEXISTS THEN
                             DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....');
                        WHEN OTHERS THEN
                             DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    RAISE;
                    END DROPTABLE;

    BEGIN
      DROPTABLE('YOUR_TABLE_HERE');
END DROPTABLE;
/   

Надеюсь, это поможет Также ссылка: PLS-00103 Ошибка в PL / SQL Developer

0 голосов
/ 17 июня 2009

Если это для MS SQL .. Следующий код всегда будет работать независимо от того, существует ли таблица уже или нет.

if object_id('mytablename') is not null //has the table been created already in the db
Begin
     drop table mytablename
End

Create table mytablename (...
...