在Oracle中创建表之前,正在尝试检查表是否存在。搜索Stackoverflow和其他网站的大部分帖子。找到一些查询,但它没有为我工作。
IF((SELECT count(*) FROM dba_tables where table_name = 'EMPLOYEE') <= 0)
THEN
create table EMPLOYEE
(
ID NUMBER(3),
NAME VARCHAR2(30) NOT NULL
)
END IF;
这给了我错误
Error: ORA-00900: invalid SQL statement
SQLState: 42000
ErrorCode: 900
Position: 1
我搜索IF
条件的语法,我认为这也是写的。请建议我……
9条答案
按热度按时间rnmwe5a21#
正如Rene所评论的那样,先检查然后创建表的情况非常少见。如果你想根据你的方法有一个运行的代码,这将是:
但我宁愿去捕捉异常,节省一些不必要的代码行:
从Oracle 23c开始,您可以使用更简单的
IF NOT EXISTS
语法:mlmc2os52#
我知道这个主题有点老了,但我想我做了一些可能对某人有用的事情,所以我把它贴出来。
我将这个帖子的答案中的建议编译成一个过程:
然后,您可以按以下方式使用它:
我知道传递两次表名有点多余,但我认为这是最简单的。
希望有人发现上面有用:-)。
yb3bgrhw3#
我的解决方案只是在线程中编译最好的想法,有一点改进。我使用专用过程(@Tomasz Borowiec)来促进重用,并使用异常处理(@Tobias Twardon)来减少代码并消除过程中的冗余表名。
zvms9eto4#
请尝试:
j91ykkif5#
mbskvtky6#
任何依赖于在创建之前进行测试的解决方案都可能会遇到“竞争”情况,即另一个进程在您测试该表不存在和创建它之间创建该表。- 我知道这点
xnifntxz7#
--检查特定模式中的表:
mzmfm0qo8#
好吧,已经有很多答案了,很多都是有意义的。
有些人提到它只是警告,有些人给出了一个临时的方法来禁用警告。所有这些都可以工作,但当数据库中的事务数很高时,会增加风险。
我今天遇到了类似的情况,这里是***非常简单的查询***我想出了…
955是失败代码。
这很简单,如果在运行查询时出现异常,它将被抑制。你可以使用相同的
SQL
或Oracle
。lrl1mhuk9#
它不需要申报和计数也适用。
将好的模式创建检查功能
并因此使用代码检查是否存在
| .|.|.|.|
| - -----|- -----|- -----|- -----|
| 索引分区|表子分区|序列|表分区|
| 程序|LOB分区|LOB|索引细分|
| Package | Package 体|类型主体|触发器|
| 联系我们|表格|浏览|功能|
| 同义词|类型|工作|......这是什么?|
或