Oracle 如果表不存在,则创建该表,并在创建后输入一行

Oracle 如果表不存在,则创建该表,并在创建后输入一行,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,如果表不存在,我需要创建一个表,并在创建时向其中添加一行 我不熟悉oracle和PL/SQL,所以我基本上需要一个与以下T-SQL等价的工具: IF OBJECT_ID('my_table', 'U') IS NULL BEGIN CREATE TABLE my_table(id numeric(38,0), date datetime) INSERT INTO my_table VALUES (NULL, 0) END 您可以与select语句一起使用: IF NOT E

如果表不存在,我需要创建一个表,并在创建时向其中添加一行

我不熟悉oracle和PL/SQL,所以我基本上需要一个与以下T-SQL等价的工具:

IF OBJECT_ID('my_table', 'U') IS NULL
BEGIN
  CREATE TABLE my_table(id numeric(38,0), date datetime)    
  INSERT INTO my_table
  VALUES (NULL, 0)
END
您可以与select语句一起使用:

IF NOT EXISTS(SELECT 1 FROM my_table) THEN
CREATE TABLE my_table(id NUMBER, date date);
COMMIT;
INSERT INTO my_table(id, date) values (NULL, O);
COMMIT;
END IF;
更新

根据注释,我不能在PL/SQL中直接使用Exist。所以这是另一种方法:

begin
  select case
           when exists(select 1
                         from my_table)
           then 1
           else 0
        end into l_exists
   from dual;

  if (l_exists = 1)
  then
    -- anything
  else
     EXECUTE IMMEDIATE 'CREATE TABLE my_table(id NUMBER, date date)';
     EXECUTE IMMEDIATE 'INSERT INTO my_table(id, date) values (NULL, O)';
  end if;
 end;

如果要检查表的创建

DECLARE count NUMBER;
BEGIN
count := 0;
SELECT COUNT(1) INTO count from user_tables WHERE table_name= 'MY_TABLE';
IF COL_COUNT = 0 THEN
EXECUTE IMMEDIATE 'create table ....';
END IF;
END;
/
A检查
DML
。请注意,您必须指定pk列和值

DECLARE count NUMBER;
BEGIN
count := 0;
SELECT COUNT(1) INTO count from MY_TABLE WHERE id= 0 and name='Something';
IF COL_COUNT = 0 THEN
EXECUTE IMMEDIATE 'insert into MY_TABLE (id,name) values(0,''something'') ';
END IF;
END;
/

还要注意,我建议在插入表时指定列,另一种方法是使用异常逻辑。我根据Oracle规则更改了字段名和类型

declare
  eAlreadyExists exception;
  pragma exception_init(eAlreadyExists, -00955);
begin
  execute immediate 'CREATE TABLE my_table(id number, dateof date)';
  execute immediate 'INSERT INTO my_table VALUES (NULL, sysdate)';
  exception when eAlreadyExists then 
      null;  
end;

但是动态创建表可能不是一个好主意

在我看来,不应该动态创建对象。在实现之前,您应该考虑一下您的设计

无论如何,如果您真的想这样做,那么您需要在PL/SQL(ab)中使用executeimmediate以编程方式完成

但是,如果要创建一个包含一行的表ta,我更喜欢CTA,即
创建表为select
。比如说,

SQL> CREATE TABLE t AS SELECT 1 id, SYSDATE dt FROM DUAL;

Table created.

SQL> SELECT * FROM t;

        ID DT
---------- ---------
         1 29-MAY-15

SQL>
该表是永久创建的

如果您正在寻找可用于存储会话特定数据的临时表,请查看

根据文件

使用CREATEGLOBAL TEMPORATE TABLE语句创建临时表 桌子oncommit子句指示表中的数据是否为 特定于事务(默认)或特定于会话


这一要求背后的原因是什么?这是一个家庭作业问题吗?通常,您不应该在PL/SQL中创建表-表是永久对象,应该创建一次,然后在任何代码中使用。如果你是在临时完成一个挨家挨户的数据,然后考虑创建一个全局临时表(GTT),它是一个永久的表,它允许数据在每个会话基础上临时存储(例如,会话2不能看到GTT中存储的会话1中的数据,反之亦然)。无论如何,在普通SQL中不能使用
IF
,但如果可以,则
从my_表中选择1
仍会得到ORA-00942。如果在PL/SQL块中执行此操作,则必须动态地创建和插入,并且也不能直接在PL/SQL中使用
exists
,只能在SQL中使用。@AlexPoole谢谢。我建议了另一种方法。您尝试过您的解决方案吗?:)正如@AlexPoole所说,您的脚本将不会编译,因为MY_表不存在。IF部分不是未编译,而是由于不同的原因,您忘记了声明等。。您需要通过从用户\u表、所有\u对象或类似的内容中选择来检查表的存在性。所以NOT EXISTS是用于查询,而不是用于测试对象的存在性。也许还值得一提的是,插入也必须动态完成?(并且将名称不一致的
col\u count
-设置为零是多余的。)@AlexPoole好的,我将在动态创建之后添加对同一块中的insertI的检查。在一个单独的街区里没有什么意义;如果select有效(因为表现在已经存在),那么insert不需要是动态的。但是OP似乎想把创建/插入作为一个步骤;那么你会让两个
在第一个块中同时执行立即
语句吗?@AlexPoole我是想提供一个更好的方法?无论如何,我会把它包括在一个块中更好的方法是拥有一个永久表,而不必这样做(8-)但是动态创建表可能不是一个好主意我同意,但只是好奇,你对为什么不动态创建表有何解释?