如果表不存在,我需要使用 sqlplus [重复] 运行脚本

Posted

技术标签:

【中文标题】如果表不存在,我需要使用 sqlplus [重复] 运行脚本【英文标题】:I need to run script if table doesn't exist using sqlplus [duplicate] 【发布时间】:2019-10-01 20:49:12 【问题描述】:

我必须使用 sqlplus 运行特定代码,但前提是数据库中不存在某个表。例如:codeA.sql 运行 codeB.sql 但仅在 tableB 存在时运行。

我尝试在 codeA.sql 的 IF 子句中使用“@codeB”,也尝试使用立即执行。

        BEGIN

        SELECT COUNT(*) INTO cnt FROM user_tables WHERE TABLE_NAME LIKE   
        'tableB';
        IF cnt = 0 THEN 
        @create_tableB_script.sql 
        END IF;

        END;

我希望 codeA 在满足条件时运行 codeB,该文件位于名为 codeB.sql 的文件中。

【问题讨论】:

【参考方案1】:

Oracle 中的表名以大写形式存储,例如不区分大小写 除非它们被引用,例如 "tAbLeB"

所以,使用

SELECT COUNT(*) INTO cnt FROM user_tables WHERE TABLE_NAME LIKE 'TABLEB';

SELECT COUNT(*) INTO cnt FROM user_tables WHERE TABLE_NAME LIKE upper('tableB');

SELECT COUNT(*) INTO cnt FROM user_tables WHERE REGEXP_LIKE(TABLE_NAME,'tableB','i'); [ --> 'i' 代表不敏感搜索]

能够看到相关的表。顺便说一句,like 运算符可能被替换为相等(=)运算符。但是,... WHERE TABLE_NAME LIKE 'tableB' 不会返回大于零的计数值。

【讨论】:

谢谢,但事实并非如此。不工作的确切部分是:```sql IF cnt = 0 THEN @create_tableB_script.sql END IF; 欢迎 @DjBesk ,我知道你返回一个大于零的值给变量 cnt,不是吗? 不,它返回 0,问题在于运行 ``` @create_tableB_script.sql @DjBesk 当您通过WHERE TABLE_NAME = 'TABLEB'; 查询时,您仍然得到 0 吗?

以上是关于如果表不存在,我需要使用 sqlplus [重复] 运行脚本的主要内容,如果未能解决你的问题,请参考以下文章

Oracle-sqlplus导入sql文件

如何使用 SqlPlus 查询的输出提示用户进行更多输入 [重复]

使用 sqitch 中的 mysql 查询验证表不存在

如果表不存在执行长查询

如果表不存在,如何使用 Derby Db 创建表

如果表不存在,如何选择不出错