PLSQL - 选择有效但在Where子句中选择不返回任何数据

时间:2014-01-29 20:37:02

标签: sql plsql

这让我发疯了。我想对列和变量进行简单的比较,但它不起作用。下面的代码中的QUERY 1在我做一个简单的选择时返回我的值,但我在第二个查询中使用结果变量它只是不起作用..

看起来很简单,但我已经花了好几个小时了。完整的sql proc是

令人困惑的是,如果我用一些硬编码的'Value'替换v_bbg_symbol(比如'FEDL01'),它会为查询2提供正确的答案,但是当我使用变量v_bbg_symbol时,它就不再起作用了

申报            v_bbg_symbol VARCHAR2(50);            V_OLD_INS_NAME Varchar2(50);

      Begin
       --QUERY 1
       SELECT BBG_SYMBOL into v_bbg_symbol FROM quotes_external WHERE ID = 1;

       --Gives output - 'FEDL01'
       DBMS_OUTPUT.PUT_LINE('I got here:'||v_bbg_symbol||' is my value'); 

      -QUERY 2
      SELECT NAME INTO V_OLD_INS_NAME FROM INSTRUMENT
      JOIN CURVE_INSTRUMENT ON
      INSTRUMENT.INSTRUMENT_ID = CURVE_INSTRUMENT.INSTRUMENT_ID
      JOIN GENERIC_INSTRUMENT ON
      CURVE_INSTRUMENT.GENERIC_INSTRUMENT_ID = GENERIC_INSTRUMENT.GENERIC_INSTRUMENT_ID
      WHERE CURVE_INSTRUMENT.CURVE_SNAPSHOT_ID =
      (SELECT MAX(CURVE_INSTRUMENT.CURVE_SNAPSHOT_ID) FROM CURVE_INSTRUMENT)
      AND GENERIC_INSTRUMENT.INSTRUMENT_NAME =  v_bbg_symbol;

      --ORACLE ERROR 'No Data Found'
      DBMS_OUTPUT.PUT_LINE('I got here:'||V_OLD_INS_NAME||' is the new value'); 
      END;

第一个'SELECT'给出了我选择INTO变量'v_bbg_symbol'的值,但是当我在第二个QUERY中使用相同的变量'v_bbg_symbol'时,它假装没有传递任何值并且不返回任何结果。如果我在第二个QUERY中给出'v_bbg_symbol'的静态值,即(在这种情况下为'FEDL01'),结果会按预期进行。

请帮助..

1 个答案:

答案 0 :(得分:0)

以下是您的查询,其中包含表别名以便于遵循它:

SELECT NAME INTO V_OLD_INS_NAME
FROM INSTRUMENT i JOIN
     CURVE_INSTRUMENT ci
     ON i.INSTRUMENT_ID = ci.INSTRUMENT_ID JOIN
     GENERIC_INSTRUMENT gi
     ON ci.GENERIC_INSTRUMENT_ID = gi.GENERIC_INSTRUMENT_ID
WHERE ci.CURVE_SNAPSHOT_ID = (SELECT MAX(ci.CURVE_SNAPSHOT_ID) FROM CURVE_INSTRUMENT ci) and
      gi.INSTRUMENT_NAME = v_bbg_symbol;

这说明最大ci.curve_snapshot_id不适用于与v_bbg_symbol相关联的工具。我想你想要一个相关的子查询:

SELECT NAME INTO V_OLD_INS_NAME
FROM INSTRUMENT i JOIN
     CURVE_INSTRUMENT ci
     ON i.INSTRUMENT_ID = ci.INSTRUMENT_ID JOIN
     GENERIC_INSTRUMENT gi
     ON ci.GENERIC_INSTRUMENT_ID = gi.GENERIC_INSTRUMENT_ID
WHERE ci.CURVE_SNAPSHOT_ID = (SELECT MAX(ci2.CURVE_SNAPSHOT_ID)
                              FROM CURVE_INSTRUMENT ci2
                              WHERE ci2.instrument_id = i.instrument_id
                             ) and
      gi.INSTRUMENT_NAME = v_bbg_symbol;