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

时间:2015-05-29 09:08:31

标签: 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

4 个答案:

答案 0 :(得分:4)

如果要查看表创建

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;
/

检查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;
/

另请注意,当您插入表格时,我需要重新指定列

答案 1 :(得分:2)

另一种方法是使用异常逻辑。我根据Oracle规则更改了字段名称和类型

0,5,10,15 * * * * /usr/local/bin/php  /var/www/html/adform.php

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

答案 2 :(得分:1)

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

无论如何,如果你真的想这样做,那么你需要使用 EXECUTE IMMEDIATE PL / SQL (ab)中以编程方式进行。

但是,如果你想用一行创建一次表ta,我更喜欢 CTAS ,即create table as 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>

该表是永久创建的。

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

来自文档,

  

使用CREATE GLOBAL TEMPORARY TABLE语句创建临时表   表。 ON COMMIT子句指示表中的数据是否为   特定于交易(默认)或特定于会话的

答案 3 :(得分:0)

您可以将NOT EXISTS与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;