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 は、2 番目のデータベースにのみ存在する列です。IDが「W」で始まらない場合、クエリは最初のデータベースでのみ実行されるため、これはまったく問題ありません。つまり、このクエリは、MYID が 'W' で始まらない場合は最初のデータベースでのみ実行され、MYID が 'W' で始まる場合は 2 番目のデータベースでのみ実行されます。

したがって、クエリは両方のデータベースで機能しますが、最初のデータベースでは ORA-00904 でクエリが失敗します。これは、最初のデータベースでは OTHER_ID が有効ではないためです (これは本当ですが、私は気にしません)。とにかくオラクルにクエリを実行させるか、これを回避するにはどうすればよいですか?

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;

2 番目のデータベース:

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 を追加する必要があります。Case db_name = db_name1 then your other_id query else some other query lk select 1 from dual... v$database ビューから db_name を取得できます。

于 2013-03-19T20:26:16.370 に答える