如何创建表并插入同一条语句

用户2681745

我是Oracle的新手,为此我感到很苦恼:

DECLARE 
 cnt NUMBER;

BEGIN
 SELECT COUNT(*) INTO cnt FROM all_tables WHERE table_name like 'Newtable'; 
 IF(cnt=0) THEN
   EXECUTE IMMEDIATE 'CREATE TABLE Newtable ....etc';
 END IF;
 COMMIT;

 SELECT COUNT(*) INTO cnt FROM Newtable where id='something'
 IF (cnt=0) THEN
   EXECUTE IMMEDIATE 'INSERT INTO Newtable ....etc';
 END IF;
END;

这一直崩溃,并在插入行上显示“ PL / SQL:ORA-00942:表或视图不存在”。如何避免这种情况?还是我做错了什么?我希望在一次交易中获得这两个语句(实际上,当然要多得多)。

亚历克斯·普尔

这不是insert问题所在,而是select之前两行。您在块中包含三个语句,而不是两个。您正在从不存在的相同新表中进行选择。您可以insert通过动态设置避免这种情况,但是您需要对select执行相同的操作:

 EXECUTE IMMEDIATE q'[SELECT COUNT(*) FROM Newtable where id='something']'
 INTO cnt;

SQL小提琴

但是在运行时创建表似乎是错误的。您说过“出于安全性考虑,该表只有在填充了正确的数据集的情况下才能存在”,这对我来说并不完全有意义-即使此块是一次性创建和填充的,依赖它的任何操作都会失败或在此运行之前使其无效。如果这是架构创建的一部分,那么使其动态化似乎并不会增加太多。您还说过,您希望两者都发生在一个事务中,但是DDL将执行隐式提交,您不能回滚DDL,并且您的手动提交无论如何都会为插入操作启动一个新事务。也许您的意思是,如果表创建失败,插入就不应发生-但无论它们是否在同一块中,插入都将失败。无论如何,这似乎有点奇怪。

此外,all_tables用于检查仍可能导致此行为异常。如果该表在其他模式存在,你create会被跳过,但你selectinsert可能仍然会失败,因为他们可能无法看到,或不会寻找,其他架构的版本。使用user_tables或添加owner支票可能会更安全一些。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在同一条语句中创建Oracle表的副本并向其中添加新列?

如何在同一条语句中创建比较布尔值和字符串的if语句?

如何在同一条sql语句中执行2条查询?

创建一个 PL/SQL 块以在 Department 表中插入一条新记录

如何停止悬吊线程池中的多个线程执行同一条语句?

如何在同一条语句中初始化队列

如何在同一条select语句中使用count和group by

如何在同一条语句中合并两个字段

如何在同一条语句中进行字母输入和浮点输入?

如何在一条语句中将多行插入DB2?

Python:如何在while循环中断之前插入一条语句

在同一条语句中添加列和索引

printf两次打印同一条语句

sql计数和总和在同一条语句

同一条语句中的SQL属性变体

同一条语句中的多个for-of循环(Javascript)

或和条件在同一条IF语句中的行为不同

根据给定的计数多次插入同一条记录

在Groovy中的一条SQL语句中插入多行

插入sqlite仅运行最后一条语句

如何从同一表中的另一条记录中获取值?

在一条语句中为两个模型创建一条记录

Laravel5.5:插入创建的模型的ID以在另一个表中创建一条记录

SQL如何使用一条SQL语句更新表行

如何通过一条语句描述数据库中的所有表?

如何在一条语句中说明Python-Pandas describe()表?

如何从第二个表中插入 mySQL 中的最后一条评论?

如何在表中插入一条记录,使ID为string的字段?

遍历表名列表并执行一条语句