oracle - Oracle 中的 CREATE TABLE 语句与存在性检查
问题描述
这个问题是受此启发的。
如前所述,我不想要 PL/SQL 的解决方案。我想要一个 1 或 2 个 SQL 语句来检查表是否存在,如果它不存在 - 创建它。
这样的语句将被插入 C++ 应用程序(不是脚本),所以我想要一个简单的 SQL 解决方案。如果不存在这样的解决方案(请这样说),我想要一个简单的字符串,我可以插入 C++ 代码并使用其中一个SQLExecute()
或本地 Oracle 客户端 API 来执行这样的字符串。
尝试用谷歌搜索解决方案,我得到的结果可以在 shell 脚本或存储过程中使用。正如我在这里和上一个问题中解释的那样——我的情况完全不同——我使用 C++ 工作并想要一个合适的解决方案。
解决方案
只有在 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++ 中的现有对象错误使用。
推荐阅读
- c - 如何检查 EOF 是否在 C 中的 getline() 函数中排在第一位?
- unity3d - 如何获得刚体2d在局部空间中的速度
- java - JButton 的图标在悬停时变得像素化
- php - PHP Slim 4 - 使用 firebase JWT 令牌授权 api 请求
- c# - Docker-compose 从另一个容器访问 MySQL 容器
- python - 没有模块名称'configparser' | PyInstaller
- python - python模块,在模块中调用主类
- java - Android Dark Mode/Light Mode - android微调器下拉弹出背景颜色
- c - C循环双向链表,静态头初始化下一个/上一个指向静态头地址的指针
- python - 因式分解,请帮我看看d出了什么问题,我是刚学习的新手