Check table exist or not before create it in Oracle

前端 未结 8 1153
清酒与你
清酒与你 2021-02-01 03:07

Trying to check is table exist before create in Oracle. Search for most of the post from Stackoverflow and others too. Find some query but it didn\'t work for me.



        
相关标签:
8条回答
  • 2021-02-01 03:13

    -- checks for table in specfic schema:

    declare n number(10);
    
    begin
        Select count(*) into n  from SYS.All_All_Tables where owner = 'MYSCHEMA' and TABLE_NAME =  'EMPLOYEE';
    
       if (n = 0) then 
         execute immediate 
         'create table MYSCHEMA.EMPLOYEE ( ID NUMBER(3), NAME VARCHAR2(30) NOT NULL)';      
       end if;
    end;
    
    0 讨论(0)
  • 2021-02-01 03:15

    Any solution which relies on testing before creation can run into a 'race' condition where another process creates the table between you testing that it does not exists and creating it. - Minor point I know.

    0 讨论(0)
  • 2021-02-01 03:18

    Please try:

    SET SERVEROUTPUT ON
    DECLARE
    v_emp int:=0;
    BEGIN
      SELECT count(*) into v_emp FROM dba_tables where table_name = 'EMPLOYEE'; 
    
      if v_emp<=0 then
         EXECUTE IMMEDIATE 'create table EMPLOYEE ( ID NUMBER(3), NAME VARCHAR2(30) NOT NULL)';
      end if;
    END;
    
    0 讨论(0)
  • 2021-02-01 03:29

    My solution is just compilation of best ideas in thread, with a little improvement. I use both dedicated procedure (@Tomasz Borowiec) to facilitate reuse, and exception handling (@Tobias Twardon) to reduce code and to get rid of redundant table name in procedure.

    DECLARE
    
        PROCEDURE create_table_if_doesnt_exist(
            p_create_table_query VARCHAR2
        ) IS
        BEGIN
            EXECUTE IMMEDIATE p_create_table_query;
        EXCEPTION
            WHEN OTHERS THEN
            -- suppresses "name is already being used" exception
            IF SQLCODE = -955 THEN
                NULL; 
            END IF;
        END;
    
    BEGIN
        create_table_if_doesnt_exist('
            CREATE TABLE "MY_TABLE" (
                "ID" NUMBER(19) NOT NULL PRIMARY KEY,
                "TEXT" VARCHAR2(4000),
                "MOD_TIME" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ');
    END;
    /
    
    0 讨论(0)
  • 2021-02-01 03:32

    I know this topic is a bit old, but I think I did something that may be useful for someone, so I'm posting it.

    I compiled suggestions from this thread's answers into a procedure:

    CREATE OR REPLACE PROCEDURE create_table_if_doesnt_exist(
      p_table_name VARCHAR2,
      create_table_query VARCHAR2
    ) AUTHID CURRENT_USER IS
      n NUMBER;
    BEGIN
      SELECT COUNT(*) INTO n FROM user_tables WHERE table_name = UPPER(p_table_name);
      IF (n = 0) THEN
        EXECUTE IMMEDIATE create_table_query;
      END IF;
    END;
    

    You can then use it in a following way:

    call create_table_if_doesnt_exist('my_table', 'CREATE TABLE my_table (
            id NUMBER(19) NOT NULL PRIMARY KEY,
            text VARCHAR2(4000),
            modified_time TIMESTAMP
      )'
    );
    

    I know that it's kinda redundant to pass table name twice, but I think that's the easiest here.

    Hope somebody finds above useful :-).

    0 讨论(0)
  • 2021-02-01 03:32
    declare n number(10);
    
    begin
       select count(*) into n from tab where tname='TEST';
    
       if (n = 0) then 
          execute immediate 
          'create table TEST ( ID NUMBER(3), NAME VARCHAR2 (30) NOT NULL)';
       end if;
    end;
    
    0 讨论(0)
提交回复
热议问题