【发布时间】:2018-06-22 06:06:27
【问题描述】:
我有两个 Oracle 11gR2 数据库(一个用于测试目的,另一个用于生产)。
通过使用条件编译,我需要创建一个在测试环境中使用数据库链接并且在生产环境中不使用数据库链接的函数。
问题是我需要将它放入包体中,这将在两种环境中自动编译。生产环境中不会有这样的数据库链接,所以包不会编译。
一种解决方案是创建一个虚拟数据库链接,该链接在生产环境中自行解析(生产 -> 生产),但这肯定不是解决此问题的正确方法。
例如:
DECLARE
v_db_name VARCHAR2(200);
vt_tbl_data data_table%ROWTYPE;
BEGIN
$IF v_db_name = 'TEST' $THEN
SELECT tbl.*
INTO vt_tbl_data
FROM data_table@otherdb tbl
WHERE ROWNUM = 1;
$ELSIF v_db_name = 'PROD' $THEN
SELECT tbl.*
INTO vt_tbl_data
FROM data_table tbl
WHERE ROWNUM = 1;
$END
END;
/
【问题讨论】:
-
自动编译是如何发生的——你有能力改变编译发生的会话吗? (大概架构名称是相同的 - 否则您可以更轻松地检查...)
-
PLSQL_CCFLAGS可以使用。您可以在测试数据库上执行ALTER SYSTEM SET PLSQL_CCFLAGS = 'env_test:true';,然后使用$IF $$env_test $THEN xxxxxx $ELSE yyyyyy $END。详情请见the documentation。但是我最喜欢同义词的想法。 -
不,我无法更改编译顺序并更改会话。但是,感谢你们两位的 cmets。直到现在才知道 PLSQL_CCFLAGS。
标签: database oracle plsql oracle11g conditional-compilation