如果表不存在,我需要创建一个表,并在创建表时为其添加一行。
我是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
答案 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;