通过多个数据库查询获取ORA-00904错误

时间:2013-03-19 20:09:09

标签: sql oracle

我有一些代码在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运行查询或者解决这个问题?

4 个答案:

答案 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。

相关问题