【问题标题】:Inner join condition is disregarded - looks like an Oracle bug内部连接条件被忽略 - 看起来像一个 Oracle 错误
【发布时间】:2017-04-30 02:17:37
【问题描述】:

这怎么可能?:如果我将 message_format_name 替换为文字“MT202”,查询将按预期工作。否则,它会返回 2 行而不是预期的 1 行——就像该条件被注释掉一样。

由于某种奇怪的原因,传入存储过程的参数值似乎不等于 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;

【问题讨论】:

  • @Aleksej 是的,我相信我对 oracle 一无所知 :-)

标签: sql oracle join parameters conditional-statements


【解决方案1】:

这不是 Oracle 错误。首先,您应该从不FROM 子句中使用逗号。您应该始终使用明确的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

【讨论】:

  • 非常感谢戈登!就是这样。 (顺便说一句,查询最初是用 ANSI 格式编写的,这种形式只是我尝试过的一种)。
  • 解决范围问题的另一种方法是将函数/过程名称添加到参数中,例如ms.message_format_name = insert_mapping.message_format_name 但是,完全避免范围界定问题肯定更容易。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 2017-12-01
  • 2019-08-22
  • 2022-01-21
  • 2018-07-13
  • 2020-02-12
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多