0

我有一些代码在 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

4 回答 4

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'
于 2013-03-19T20:34:12.563 回答
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。

于 2013-03-19T20:30:40.230 回答
1

我不确定将这个列添加到当前不存在的数据库中会出现什么问题,但添加它似乎是一个相当低的工作量和低风险的练习,并且会永久解决这类问题。

于 2013-03-19T20:36:07.267 回答
0

在检查数据库名称之后,您可能需要添加另一个 CASE。案例 db_name = db_name1 然后是您的 other_id 查询或者其他一些查询 lk select 1 from dual... 您可以从 v$database 视图获取 db_name。

于 2013-03-19T20:26:16.370 回答