我有一些代码在2个不同的数据库中运行相同的查询。
SELECT
P.MYID,
CASE WHEN
SUBSTR(P.MYID, 1, 1) NOT IN ('W') THEN
'YOUR_ID_IS_NOT_START_WITH_W'
ELSE
(SELECT OTHER_ID FROM PERSON WHERE NUMBER = '2554' )
END AS "ALTERNATE_ID"
FROM
PERS_INFO P
WHERE
P.NUMBER = '2554'
此示例中的OTHER_ID是仅存在于第二个数据库中的列。这完全没问题,因为当id不以'W'开头时,查询只会在第一个数据库中执行。换句话说,此查询将仅在第一个数据库中运行,此时MYID不以“W”开头,并且只有在MYID以“W”开头时才会在第二个数据库中运行。
因此查询可以在两个数据库中工作,但是,查询在第一个数据库中失败并带有ORA-00904,因为它说第一个数据库中的OTHER_ID不合法(这是真的,但我不在乎)。我如何强制oracle运行查询或者解决这个问题?
答案 0 :(得分:2)
您可以在两个数据库中创建一个函数来获取OTHER_ID值。它只会在您的第一个数据库中返回null。
例如,在第一个数据库中:
create or replace function f_get_other_id(for_no in varchar2) return varchar2 is
begin
return null;
end;
在第二个数据库中:
create or replace function f_get_other_id(for_no in varchar2) return varchar2 is
v_other_id varchar2(100);
begin
select other_id into v_other_id from person where number = for_no;
return other_id;
end;
然后,您的查询可以是:
select p.myid,
case
when substr(p.myid, 1, 1) not in ('W') then 'YOUR_ID_IS_NOT_START_WITH_W'
else f_get_other_id('2554')
end as "ALTERNATE_ID"
from pers_info p
where p.number = '2554'
答案 1 :(得分:1)
您是否听说过EXECUTE_IMMEDIATE(http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm)命令或DBMS_SQL(请参阅http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sql.htm)?
如果您正在使用具有不同表定义的各种数据库上的脚本,这可能是您的解决方案,但这需要PL / SQL。
答案 2 :(得分:1)
我不确定将此列添加到当前不存在的数据库中会出现什么问题,但添加它似乎是一项非常省力和低风险的练习,并且会永久地解决这类问题。
答案 3 :(得分:0)
在检查数据库名称之后,可能需要添加另一个CASE。大小写db_name = db_name1然后你的other_id查询其他一些查询lk从双重选择1 ...你可以从v $ database视图中获取db_name。