2016-12-14 8 views
1

これはどのように可能ですか?message_format_nameをリテラル 'MT202'に置き換えた場合、クエリは正常に動作します。それ以外の場合は、期待される1の代わりに2行を返します。これは、その条件がコメントアウトされた場合と同じです。内部結合条件は無視されます - Oracleバグのように見えます

ストアドプロシージャに渡されるパラメータ値が、いくつかの奇妙な理由でms.message_format_nameの値と等しくないようです。

詳細が必要な場合はお知らせください。 ありがとう!

set define off; 
create or replace PROCEDURE   insert_mapping(
     interface_name  IN VARCHAR2, 
     message_format_name IN VARCHAR2, 
     determined_field_type IN VARCHAR2, 
     source_field   IN VARCHAR2, 
     mapping_key   IN VARCHAR2, 
     mapping_key_value1 IN VARCHAR2, 
     mapping_key_value2 IN VARCHAR2 DEFAULT NULL, 
     return_val OUT sys_refcursor) 
AS 
BEGIN 
    dbms_output.put_line('interface_name = ' || interface_name); 
    dbms_output.put_line('message_format_name = ' || message_format_name); 
    dbms_output.put_line('determined_field_type = ' || determined_field_type); 
    dbms_output.put_line('source_field = ' || source_field); 
/* INSERT 
    INTO payments.multi_value_lookup_mapping 
     (
      pk_multi_value_lkp_mapping, 
      fk_pk_multi_value_lookup_confg, 
      mapping_key, 
      mapping_key_value1, 
      mapping_key_value2, 
      created_by, 
      created_dt, 
      update_by, 
      update_dt 
     )*/ 
    OPEN return_val FOR   
    SELECT payments.seq_multi_value_lookup_map.nextval, 
     mvlc.pk_multi_value_lookup_config, 
     mapping_key, 
     mapping_key_value1, 
     mapping_key_value2, 
     50000, 
     SYSDATE, 
     50000, 
     SYSDATE 
    FROM payments.multi_value_lookup_config mvlc, payments.message_source ms 
    WHERE (ms.pk_message_source  = mvlc.fk_pk_message_source 
     AND ms.interface_name   = interface_name 
     AND ms.message_format_name = message_format_name /*'MT202'*/ 
     AND mvlc.mapping_column_name = source_field 
     AND mvlc.lookup_category_type = determined_field_type 
     ); 

END insert_mapping; 
+0

@Aleksejはい、私は – Lamak

答えて

4

これはOracleのバグではありません。まず、は句ではカンマを使用しないでください。 常には明示的にJOIN構文を使用する必要があります。

しかし、それはあなたの特定の問題ではありません。可変解像度と有効範囲があります。

問合せにinterface_nameなどの参照がある場合、Oracleは最初にその名前の列を検索します。それは決して変数を見ることはありません。あなたはより多くのこのようなコードで終わるので、変数に特徴的な名前を付け:

. . . 
    FROM payments.multi_value_lookup_config mvlc JOIN 
     payments.message_source ms 
     ON ms.pk_message_source = mvlc.fk_pk_message_source 
    WHERE ms.interface_name = v_interface_name 
      ms.message_format_name = v_message_format_name /*'MT202'*/ 
      mvlc.mapping_column_name = v_source_field 
      mvlc.lookup_category_type = v_determined_field_type 
+0

:-)オラクルについて何も知らないことを信じて、非常に多くのゴードンをありがとうございます!それはそれだった。 (クエリは元々btwというANSI形式で書かれていましたが、この形式は私が試したことの一つに過ぎません)。 – dreadwulf

+1

スコープの問題を解決する別の方法は、関数/プロシージャ名をパラメータに付加することです。 'ms.message_format_name = insert_mapping.message_format_name'しかし、スコープの問題を完全に回避することは間違いなく簡単です。 – Sentinel

関連する問題