在 Oracle pl/sql 中创建或替换表
Posted
技术标签:
【中文标题】在 Oracle pl/sql 中创建或替换表【英文标题】:Create or replace table in Oracle pl/sql 【发布时间】:2013-05-19 12:35:01 【问题描述】:我需要一个脚本来创建表,或者如果它已经存在则删除它,并在重新创建表时。经过一番研究,我发现 pl/sql 中的CREATE OR REPLACE TABLE
不存在。所以我想出了这个脚本:
DECLARE
does_not_exist EXCEPTION;
PRAGMA EXCEPTION_INIT (does_not_exist, -942);
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE foobar';
EXCEPTION
WHEN does_not_exist
THEN
NULL;
END;
/
CREATE TABLE foobar (c1 INT);
有没有合适的方法来实现这个功能?
【问题讨论】:
根据您的尝试,临时表可能会有用。 不,我需要使用表,而不是临时表。不过谢谢你的建议。 我从来不明白这件事。只需删除表格 - 如果它存在,则不会造成任何伤害。 【参考方案1】:您真的不应该在 PL/SQL 中这样做,在运行时创建的表将表明您的数据模型存在缺陷。如果你真的确信你绝对必须这样做,那么首先调查temporary tables。就个人而言,我会重新评估是否有必要。
您似乎正在采用EAFP as opposed to LBYL 方法,this question 的一些答案中对此进行了描述。我认为这是不必要的。表是一个相当静态的野兽,你可以在删除它之前使用系统视图USER_TABLES 来确定它是否存在。
declare
l_ct number;
begin
-- Determine if the table exists.
select count(*) into l_ct
from user_tables
where table_name = 'THE_TABLE';
-- Drop the table if it exists.
if l_ct = 1 then
execute immediate 'drop table the_table';
end if;
-- Create the new table it either didn-t exist or
-- has been dropped so any exceptions are exceptional.
execute immediate 'create table the_table ( ... )';
end;
/
【讨论】:
谢谢 Ben,我知道,在运行时重新创建表是不好的方法,但我必须完成交给我的任务。【参考方案2】:使用全局temporary table 似乎是更好的选择。但是,如果您坚持在运行时删除和重新添加表,您可以查询 _TABLES 视图之一(即 USER_TABLES、DBA_TABLES、ALL_TABLES)以确定表是否存在,如果存在则删除它,然后创建它:
SELECT COUNT(*)
INTO nCount
FROM USER_TABLES
WHERE TABLE_NAME = 'FOOBAR';
IF nCount <> 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE FOOBAR';
END IF;
EXECUTE IMMEDIATE 'CREATE TABLE FOOBAR(...)';
分享和享受。
【讨论】:
@Ben - 领先我一分钟!以上是关于在 Oracle pl/sql 中创建或替换表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 select 的 where 子句中替换 oracle pl/sql 变量
Oracle PL/SQL,如何使用简单的替换变量和months_between计算出生日期的年龄