Oracle 如果表不存在,则创建该表,并在创建后输入一行
如果表不存在,我需要创建一个表,并在创建时向其中添加一行 我不熟悉oracle和PL/SQL,所以我基本上需要一个与以下T-SQL等价的工具: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
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-)但是动态创建表可能不是一个好主意我同意,但只是好奇,你对为什么不动态创建表有何解释?