如果表不存在,我需要使用 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 [重复] 运行脚本的主要内容,如果未能解决你的问题,请参考以下文章