【问题标题】:How to iterate output of query to another select query as an input parameter?如何将查询的输出迭代到另一个选择查询作为输入参数?
【发布时间】:2015-09-12 23:06:58
【问题描述】:

我想将以下查询的输出作为输入参数传递给另一个查询。

 SELECT DISTINCT MV_sum.exch
          FROM LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum,
               EXCHANGE_MAPPING ex_map
         WHERE MV_SUM.EXCH = ex_map.agora_exchange
ORDER BY 1;

查询 1 的示例输出:

ABC
CDE
DEF
GHI
XYX

我想将此输出一一作为输入参数传递给以下查询 将输出迭代到另一个查询

我已经编写了以下代码,因为我是 oracle 的新手,但是它抛出了一些错误 请帮我解决这个问题.....

DECLARE
   exch_name       VARCHAR2 (200);
   v_exch          VARCHAR2 (1000);
   v_exch_output   VARCHAR2 (4000);
   v_cnt_tot       VARCHAR2 (4000);
   abc             VARCHAR2 (4000);
   v_str           VARCHAR2 (4000);

   CURSOR tbl
   IS
        SELECT DISTINCT MV_sum.exch
          FROM LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum,
               EXCHANGE_MAPPING ex_map
         WHERE MV_SUM.EXCH = ex_map.agora_exchange
      ORDER BY 1;
BEGIN
   v_cnt_tot := 0;

   OPEN tbl;

   LOOP
      FETCH tbl INTO exch_name;

      EXIT WHEN tbl%NOTFOUND;
      v_str :=
         ' select distinct ''ICTO-10510'' ,   MV_sum.exch , to_char(to_date(MV_sum.TRADEDATE,''yymmdd''), ''dd-Mon-yyyy'')   ,  ''   ,  ''TDV''   ,  MV_sum.new  ,   ''NEW'' ,  '' , ''-- into abc  
from LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum , EXCHANGE_MAPPING ex_map
where (TRADEDATE between TO_CHAR  (sysdate-545, ''YYMMDD'') and TO_CHAR  (sysdate, ''YYMMDD'') )
and MV_SUM.EXCH = ex_map.agora_exchange
and MV_sum.exch = exch_name
group by MV_sum.exch,
to_char(to_date(MV_sum.TRADEDATE, ''yymmdd''), ''dd-Mon-yyyy''),
MV_sum.new';

      EXECUTE IMMEDIATE v_str;

      DBMS_OUTPUT.PUT_LINE (v_str);
   END LOOP;



   CLOSE tbl;
END;
/

请告诉我该怎么做。

【问题讨论】:

  • 您遇到什么错误?为什么要使用 EXECUTE IMMEDIATE?你也错过了 EXECUTE IMMEDIATE v_str INTO 变量;

标签: oracle plsql oracle11g oracle-sqldeveloper plsqldeveloper


【解决方案1】:

如果这是您需要实现的,代码不会将结果作为“选择语句”返回给您。 从您的代码中我注意到: - 您仅使用游标来遍历 EXCHANGE_MAPPING 表中的不同值 - 你可以取出这个语句 EXECUTE IMMEDIATE v_str - 如果你只使用 select 语句,你会得到同样的结果

    select distinct 'ICTO-10510' ,   MV_sum.exch ,    to_char(to_date(MV_sum.TRADEDATE,'yymmdd'), 'dd-Mon-yyyy'),
                '','TDV',  MV_sum.new ,  'NEW' ,  '', ''
from LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum , EXCHANGE_MAPPING ex_map
where (TRADEDATE between TO_CHAR  (sysdate-545, 'YYMMDD') and TO_CHAR  (sysdate, 'YYMMDD') )
and MV_SUM.EXCH = ex_map.agora_exchange
group by MV_sum.exch,
to_char(to_date(MV_sum.TRADEDATE, 'yymmdd'), 'dd-Mon-yyyy'), MV_sum.new

【讨论】:

    【解决方案2】:

    您好,您可以尝试以下代码。

    DECLARE
      exch_name     VARCHAR2(200);
      v_exch        VARCHAR2(1000);
      v_exch_output VARCHAR2(4000);
      v_cnt_tot     VARCHAR2(4000);
      abc           VARCHAR2(4000);
      v_str         VARCHAR2(4000);
    
      CURSOR tbl IS
        SELECT DISTINCT MV_sum.exch
          FROM LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum, EXCHANGE_MAPPING ex_map
         WHERE MV_SUM.EXCH = ex_map.agora_exchange
         ORDER BY 1;
    BEGIN
      v_cnt_tot := 0;
      for x in tbl loop
        -- no need of EXECUTE IMMEDIATE it will harm performance
        select distinct '' ICTO - 10510 '',
                        MV_sum.exch,
                        to_char(to_date(MV_sum.TRADEDATE, '' yymmdd ''), '' dd - Mon - yyyy ''),
                        '',
                        '' TDV '',
                        MV_sum.new,
                        '' NEW '',
                        '',
                        '' -- into abc  
          from LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum, EXCHANGE_MAPPING ex_map
         where (TRADEDATE between TO_CHAR(sysdate - 545, '' YYMMDD '') and TO_CHAR(sysdate, '' YYMMDD ''))
           and MV_SUM.EXCH = ex_map.agora_exchange
           and MV_sum.exch = exch_name
        **--and  MV_sum.exch = x.exch**  exch value from upper query  
         group by MV_sum.exch, to_char(to_date(MV_sum.TRADEDATE, '' yymmdd ''), '' dd - Mon - yyyy ''), MV_sum.new;
    
      end loop;
    
    exception
      when others then
        null;
    END;
    

    【讨论】:

      【解决方案3】:

      您好,您可以试试这个,如果您对所有行感兴趣,您需要通过 rownum =1 限制数量或行,那么您需要使用集合来保存所有值。不知道订单对您来说有什么重要意义,那么您需要在循环内修改查询

      DECLARE
        exch_name VARCHAR2(200);
        v_exch    VARCHAR2(1000);
        output    VARCHAR2(4000);
        abc       VARCHAR2(4000); -- remove this.
      
        CURSOR tbl IS
          SELECT DISTINCT MV_sum.exch
            into exch_name
            FROM LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum, EXCHANGE_MAPPING ex_map
           WHERE MV_SUM.EXCH = ex_map.agora_exchange
           ORDER BY 1;
      BEGIN
      
        for x in tbl loop
          select 'ICTO-10510' || ',' || MV_sum.exch || ',' || to_char(to_date(MV_sum.TRADEDATE, 'yymmdd'), 'dd-Mon-yyyy') || ',' || '' || ',' || 'TDV' || ',' ||
                 MV_sum.new || ',' || "NEW" || ',' || '' || ',' || ''
            into output
            from LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum, EXCHANGE_MAPPING ex_map
           where (TRADEDATE between TO_CHAR(sysdate - 545, 'YYMMDD') and TO_CHAR(sysdate, 'YYMMDD'))
             and MV_SUM.EXCH = ex_map.agora_exchange
             and MV_sum.exch = x.exch --**changes**
             and rownum = 1
           group by MV_sum.exch, to_char(to_date(MV_sum.TRADEDATE, 'yymmdd'), 'dd-Mon-yyyy'), MV_sum.new;
      
          /* EXECUTE IMMEDIATE abc
          into output; */
          --dont need this .. .. 
          DBMS_OUTPUT.PUT_LINE(output);
        end loop;
      
      exception
        when others then
          DBMS_OUTPUT.PUT_LINE('null');
          --null;`enter code here`
      END;
      

      【讨论】:

      • 嗨,毗湿奴,我尝试了你提供的代码..但它仍然抛出异常..并且输出为 null..Plaese guide on teh same..
      • 你能提供什么是例外吗?编译了吗?
      猜你喜欢
      • 1970-01-01
      • 2018-11-05
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多