首页 > 解决方案 > Oracle 中的 CREATE TABLE 语句与存在性检查

问题描述

这个问题是受此启发的。

如前所述,我不想要 PL/SQL 的解决方案。我想要一个 1 或 2 个 SQL 语句来检查表是否存在,如果它不存在 - 创建它。

这样的语句将被插入 C++ 应用程序(不是脚本),所以我想要一个简单的 SQL 解决方案。如果不存在这样的解决方案(请这样说),我想要一个简单的字符串,我可以插入 C++ 代码并使用其中一个SQLExecute()或本地 Oracle 客户端 API 来执行这样的字符串。

尝试用谷歌搜索解决方案,我得到的结果可以在 shell 脚本或存储过程中使用。正如我在这里和上一个问题中解释的那样——我的情况完全不同——我使用 C++ 工作并想要一个合适的解决方案。

标签: oracleoracle11gddlcreate-table

解决方案


只有在 Oracle 11g 中不存在表时,才会创建一个单独的 SQL 语句。

为什么你反对基于 PL/SQL 的解决方案对我来说并不明显。如果您在 C++ 中使用原始 ODBC 调用,则可以SQLPrepare像传递普通 SQL 语句一样传递 PL/SQL 块。鉴于 PL/SQL 块的工作方式几乎与纯 SQL 语句完全一样,断然拒绝基于 PL/SQL 的解决方案是不寻常的。

如果您要断然拒绝 PL/SQL,您当然可以从任何基于 PL/SQL 的解决方案中获取逻辑,并在从您的应用程序执行的几个 SQL 语句中实现它。比如你可以查询dba_| all_| user_tables(根据你的权限,是否在其他schema中创建表等)判断表是否存在,然后有条件地执行你的DDL

select owner, table_name
  from dba_tables
 where owner = <<schema that will own the table>
   and table_name = <<name of the table>>

如果没有返回任何行,则可以执行 DDL。

当然,您也可以只执行 DDL 语句并捕获 ORA-00955 名称已被 C++ 中的现有对象错误使用。


推荐阅读