如何使用 CREATE 或 REPLACE?

我的理解是否正确,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')

我是不是做了什么蠢事? 我似乎找不到太多关于这种语法的文档。

373510 次浏览

这适用于函数、过程、包、类型、同义词、触发器和视图。

更新:

在第三次更新这篇文章之后,我将重新表述一下:

这在表上不起作用:)

是的,在这个语法上有 < strong > 文档 ,对于 CREATE TABLE没有 REPLACE选项。

在 Oracle 中没有创建或替换表。

你必须:

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

Does not work with Tables, only functions etc.

这里是一个网站与一些 例子

CREATE OR REPLACE只能用于函数、过程、类型、视图或包——它不能用于表。

如果这是为 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 (...

这种语法的优点之一是,您可以确保 CREATE OR REPLACE永远不会导致您丢失数据(最多丢失的是代码,希望您已经将代码存储在源代码控制的某个地方)。

The equivalent syntax for tables is ALTER, which means you have to explicitly enumerate the exact changes that are required.

编辑: By the way, if you need to do a DROP + CREATE in a script, and you don't care for the spurious "object does not exist" errors (when the DROP doesn't find the table), you can do this:

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

下面的脚本应该可以解决甲骨文的问题:

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

如果你正在做的代码,然后首先检查数据库中的表 通过使用查询 SELECT table _ name FROM user _ tables WHERE table _ name = ‘ XYZ’

如果发现记录,则截断表,否则创建表

像创建或替换一样工作。

可以使用 CORT (Www.softcraftltd.co.uk/cort)。此工具允许在 Oracle 中创建或替换表。 看起来像是:

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

它能保存数据。

Oracle 数据库的有用过程,不使用异常(在某些情况下,必须用 dba _ tables 替换 user _ tables 和/或限制查询中的表空间) :

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

所以我一直在使用这个,它工作得非常好:-它的工作更像一个下降,如果存在,但得到的工作完成

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

希望这个能帮上忙 参考文献: PL/SQL 开发程序中的 PLS-00103错误

“创建或替换表”是不可能的。正如其他人所说,您可以编写一个过程和/或使用立即开始执行(...)。因为我没有看到关于如何(重新)创建表的答案,所以我把一个脚本作为答案。

注: 正如 Jeffrey-kemp 所提到的: 下面的脚本不会保存已经存在于要删除的表中的数据。由于存在数据丢失的风险,在我们的公司中,只允许修改生产环境中的现有表,不允许删除表。通过使用放下桌子的陈述,迟早你会得到公司的警察站在你的办公桌前。

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

我会做这样的事

  begin
for i in (select table_name from user_tables where table_name = 'FOO') loop
execute immediate 'drop table '||i.table_name;
end loop;
end;


execute immediate 'CREATE TABLE FOO (id NUMBER,
title VARCHAR2(4000)) ';