我是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;
但是在运行时创建表似乎是错误的。您说过“出于安全性考虑,该表只有在填充了正确的数据集的情况下才能存在”,这对我来说并不完全有意义-即使此块是一次性创建和填充的,依赖它的任何操作都会失败或在此运行之前使其无效。如果这是架构创建的一部分,那么使其动态化似乎并不会增加太多。您还说过,您希望两者都发生在一个事务中,但是DDL将执行隐式提交,您不能回滚DDL,并且您的手动提交无论如何都会为插入操作启动一个新事务。也许您的意思是,如果表创建失败,插入就不应发生-但无论它们是否在同一块中,插入都将失败。无论如何,这似乎有点奇怪。
此外,all_tables
用于检查仍可能导致此行为异常。如果该表在其他模式存在,你create
会被跳过,但你select
并insert
可能仍然会失败,因为他们可能无法看到,或不会寻找,其他架构的版本。使用user_tables
或添加owner
支票可能会更安全一些。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句