【问题标题】:CREATE TABLE statement in Oracle with the existence checkOracle 中的 CREATE TABLE 语句与存在性检查
【发布时间】:2021-04-28 18:15:11
【问题描述】:

这个问题的灵感来自this

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

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

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

【问题讨论】:

  • 这就是 Oracle 的乐趣所在。对于很多问题,答案是存储过程。并且没有数据库解决方案是“仅限 C++”...您依赖数据库来获取东西,这只是另一种情况。
  • @PaulProgrammer,那么我该如何使用 Oracle?我已经有了其他 DBMS 的解决方案...
  • 我不确定我是否理解这个问题。如果您使用原始 ODBC 调用,您可以将匿名 PL/SQL 块传递给SQLPrepare,就像传递纯 SQL 语句一样。 PL/SQL 似乎是一个完全合适的解决方案。当然,您可以从 PL/SQL 块中获取单独的 SQL 语句,并从您的应用程序中按顺序执行它们。这种情况下,查询dba_|all_|user_tables判断表是否存在,然后有条件地执行DDL。
  • @JustinCave,所以有简单的plain SQL 解决方案吗?正如我所说 - 如果没有 1 或 2 条普通 SQL 语句,我将采用 PL/SQL 解决方案。另外,现在我正在编写 ODBC 解决方案,但计划接下来使用本机客户端。现在你说的是哪两个查询?
  • 这是对 meta 上正在讨论的一个封闭问题的(改写)转贴。 CREATE TABLE statement in Oracle

标签: oracle oracle11g ddl create-table


【解决方案1】:

没有任何一条 SQL 语句只会在 Oracle 11g 中不存在表时创建表。

对我来说,您反对基于 PL/SQL 的解决方案的原因并不明显。如果您在 C++ 中使用原始 ODBC 调用,则可以将 PL/SQL 块传递给 SQLPrepare,就像传递普通 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++ 中的现有对象错误使用。

【讨论】:

    猜你喜欢
    • 2018-03-16
    • 2012-12-12
    • 2018-06-06
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多