Como eu uso CRIAR OU SUBSTITUIR?
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.
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 (...