我在了解创建或更换正确的基本意思是“如果对象存在,删除它,然后创建它无论哪种方式?”
如果是这样,我究竟做错了什么? 这工作:
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')
我做一些愚蠢的事? 我似乎并没有能够找到关于这句法多文档。
Answer 1:
这适用于函数,过程,包,类型,同义词,触发器和视图。
更新:
更新后的第三次之后,我会重新制定这样的:
这并不表上的工作:)
是的,有文件在此语法,并没有REPLACE
的选项CREATE TABLE
。
Answer 2:
一个关于语法的好处之一是,你可以肯定,一个CREATE OR REPLACE
绝不会导致你失去的数据(最你将失去的代码,希望你能在什么地方存储在源代码控制)。
为表等效语法ALTER,这意味着你必须明确地列举了所需的确切变化。
编辑:顺便说一句,如果你需要做一个DROP +在脚本创建,你不照顾假“对象不存在”的错误(当降不找到表),你可以做这个:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
WHEN OTHERS THEN
IF sqlcode != -0942 THEN RAISE; END IF;
END;
/
Answer 3:
没有建立或者Oracle替换表。
你必须:
DROP TABLE foo;
CREATE TABLE foo (....);
Answer 4:
CREATE OR REPLACE
只能在功能,程序,类型,视图或包使用-它不会对表工作。
Answer 5:
下面的脚本应该做甲骨文的伎俩:
BEGIN
EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
WHEN OTHERS THEN
IF sqlcode != -0942 THEN RAISE;
END IF;
END;
Answer 6:
Answer 7:
-- 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;
/
Answer 8:
对于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;
Answer 9:
如果您通过代码实现然后先用SELECT查询表名FROM USER_TABLES检查表中的数据库在表格名=“XYZ”
如果找到记录,然后截断表,否则创建表
像创建或替换工作。
Answer 10:
您可以使用皮质醇( www.softcraftltd.co.uk/cort )。 此工具可以创建或甲骨文更换表。 看起来像:
create /*# or replace */ table MyTable(
... -- standard table definition
);
它保留数据。
Answer 11:
所以,我一直在使用这一点,它一直非常好: - 它的工作原理更像是一个跌落如果存在,但能够完成任务
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开发人员
Answer 12:
'Create or replace table' is not possible. As others stated, you can write a procedure and/or use begin execute immediately (...). Because I don't see an answer with how to (re)create the table, I putted a script as an answer.
PS: in line of what jeffrey-kemp mentioned: this beneath script will NOT save data that is already present in the table you are going to drop. Because of the risk of loosing data, at our company it is only allowed to alter existing tables on the production environment, and it is not allowed to drop tables. By using the drop table statement, sooner or later you will get the company police standing at your desk.
--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;
Answer 13:
如果这是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 (...
文章来源: How do I use CREATE OR REPLACE?