如果表格已经存在,则创建一个表格

时间:2018-05-29 21:30:32

标签: sql oracle plsql ddl

我试图创建一个表,如果它还没有存在的话。我目前正在检查它是否首先存在于DBA_TABLES中,如果该查询没有返回任何内容,则插入。有没有办法只检查相同的声明,所以我不必将其分解为单独的查询?

这就是我目前所拥有的。

BEGIN
    SELECT COUNT(*)
    INTO lvnTableExists
    FROM DBA_TABLES
    WHERE Table_Name = 'SOME_TABLE';

    IF lvnTableExists = 0 THEN
        EXECUTE IMMEDIATE 'CREATE TABLE SOME_TABLE AS (SELECT * FR0M OTHER_TABLE)';
    END IF;
END;

这是我想要的。

DECLARE
    sql VARCHAR2(100000);
BEGIN
    sql := 'CREATE TABLE SOME_TABLE ' ||
            'AS (SELECT * FROM OTHER_TABLE) ' ||
            'WHERE NOT EXISTS (SELECT NULL ' ||
            'FROM DBA_OBJECTS d WHERE d.Object_Name = 'SOME_TABLE' AND ' ||
            'd.Owner = 'SOME_TABLE')';
    EXECUTE IMMEDIATE sql;
END;

问题在于,您无法在WHERE NOT EXISTS声明中添加CREATE TABLE AS

1 个答案:

答案 0 :(得分:4)

是的,甲骨文没有这种功能真的很遗憾。我相信它有一天会到来。在那之前,如果你想编写一个PL / SQL包装器,为什么不这样做呢:

DEClARE
     table_exists_already exception; 
     pragma exception_init(table_exists_already, -955 ); 
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE SOMETABLE...';
EXCEPTION WHEN table_exists_already THEN
  DBMS_OUTPUT.PUT_LINE('Table sometable already exists');
END;
/