Oracle PL/SQL 根据环境变量的结果有条件地执行语句的方法 - DB 管道和 Flyway

问题描述 投票:0回答:1

我正在使用 Flyway Placeholders 针对特定环境有条件地执行语句

我们在生产之前进行管道检查,查看 QA/测试等的模式历史表,以确保每个脚本针对每个之前的环境成功运行 - 如果没有,则管道失败。

这是管理层传达的要求。

所以不幸的是我们不能使用ShouldExecute,因为它不会执行整个脚本。

如果我们使用 ShouldExecute - 如果该脚本仅针对 Prod 运行,那么该脚本将从 QA/Test 中的模式历史表中丢失。

所以脚本本身需要内置该条件,这样无论里面的语句是否执行,它都可以成功运行。

我想也许下面的方法会起作用:

IF ${environment} = 'test' THEN      
    ALTER TABLE hr.job_history ADD (employee_name VARCHAR2(20 BYTE));    
END IF;

这给出了

SQL State  : 42000
Error Code : 900
Message    : ORA-00900: invalid SQL statement

因为上述语句仅适用于函数/过程内部 - 有一种简单的方法可以做到这一点吗?

我查看了这个线程,但我不知道如何根据我的用例调整脚本。

oracle plsql jenkins-pipeline flyway
1个回答
0
投票

如果要实现的是条件编译,则表达式应使用

$IF ... $THEN ... $ELSE ... $END;
语法,这意味着要么 $THEN 中的代码,要么 $ELSE 子句中的代码将被编译。文档:https://www.oracle.com/technetwork/database/features/plsql/overview/plsql-conditional-compilation-133587.pdf 变量是使用会话变量 PLSQL_CCFlags 传递的,因此 Flyway 驱动的变量应该注入到定义它的前奏中。

© www.soinside.com 2019 - 2024. All rights reserved.