Pergunta

Am I corrigir no entendimento de que CRIAR OU SUBSTITUIR basicamente significa "se o objeto existe, soltá-lo, em seguida, criar-lo de qualquer maneira?"

Se assim for, o que estou fazendo de errado? Isso funciona:

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

E isto não faz (ORA-00922: falta ou opção inválida):

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

Estou fazendo algo estúpido? Eu não parecem ser capazes de encontrar muita documentação sobre esta sintaxe.

Foi útil?

Solução

Isso funciona em funções, procedimentos, pacotes, tipos, sinônimos, gatilho e pontos de vista.

Update:

Depois de atualizar o cargo pela terceira vez, eu vou reformular isto:

Isso não funciona em tabelas:)

E sim, há documentação sobre essa sintaxe, e não há opção REPLACE para CREATE TABLE.

Outras dicas

Uma das coisas agradáveis ??sobre a sintaxe é que você pode ter certeza que um CREATE OR REPLACE nunca vai causar a perda de dados (o máximo que você vai perder é o código, que esperamos que você vai ter armazenado em algum lugar de controle de origem).

A sintaxe equivalente para tabelas é ALTER, o que significa que você tem que enumerar explicitamente as mudanças exatas que são necessários.

EDIT: By the way, se você precisa fazer uma GOTA + CRIAR em um script, e você não se importa com a espúria "objeto não existe" erros (quando a queda de não encontrar a tabela), você pode fazer isso:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/

Não existe criar ou substituir a tabela no Oracle.

Você deve:

DROP TABLE foo;
CREATE TABLE foo (....);

CREATE OR REPLACE só pode ser usado em funções, procedimentos, tipos, exibições ou pacotes -. Não vai funcionar em tabelas

A seguir script deve fazer o truque em Oracle:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;

não funciona com tabelas, apenas funções etc.

Aqui está um site com algum exemplos .

-- To Create or Replace a Table we must first silently Drop a Table that may not exist
DECLARE
  table_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT (table_not_exist , -00942);
BEGIN
   EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS');
   EXCEPTION WHEN table_not_exist THEN NULL;
END;
/

Um procedimento útil para bancos de dados Oracle sem usar exeptions (sob circunstâncias você tem que substituir user_tables com DBA_TABLES e / ou restringir o espaço de tabela na consulta):

create or replace procedure NG_DROP_TABLE(tableName varchar2)
is
   c int;
begin
   select count(*) into c from user_tables where table_name = upper(tableName);
   if c = 1 then
      execute immediate 'drop table '||tableName;
   end if;
end;

Se você está fazendo no código, em seguida, verifique primeiro para a tabela no banco de dados usando consulta SELECT table_name DE user_tables Onde table_name = 'XYZ'

Se registro encontrado mesa, em seguida, truncar o contrário CREATE TABLE

O trabalho como criar ou substituir.

Você pode usar CORT ( www.softcraftltd.co.uk/cort ). Esta ferramenta permite criar ou substituir a tabela no Oracle. Parece que:

create /*# or replace */ table MyTable(
  ... -- standard table definition
);

Ele preserva dados.

Então, eu tenho usado isso e tem funcionado muito bem: - ele funciona mais como um cair se existe, mas começa o trabalho feito

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;
/   

Espero que isso ajude De referir, ainda: PLS-00103 Erro no PL / SQL Developer

'Criar ou substituir a tabela' não é possível. Como outros declarou, você pode escrever um procedimento e / ou uso começar a executar imediatamente (...). Porque eu não ver uma resposta com a forma de (re) criar a tabela, eu põr um script como uma resposta.

PS: na linha do que Jeffrey-kemp mencionado: esta debaixo de script não salvará os dados que já está presente na tabela que você está indo a cair. Por causa do risco de perda de dados, a nossa empresa só é permitido para alterar tabelas existentes no ambiente de produção, e não é permitido descartar tabelas. Usando a instrução drop table, mais cedo ou mais tarde você vai ter a companhia de polícia que está em sua mesa.

--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;

Se isto é para MS SQL .. O código a seguir sempre será executado não importa o que se a exist tabela já ou não.

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

Create table mytablename (...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top