【问题标题】:Oracle Merge. How can I use it?甲骨文合并。我该如何使用它?
【发布时间】:2012-07-19 05:01:36
【问题描述】:

我有这个功能:

      Procedure UpdateDefaultWeight  ( vYear Number, costWeight Number, qualityWeight Number, serviceWeight Number ) 
      AS

        type weight_table is table of Number(5,2) index by varchar2(50);
        weightArray weight_table;
        currentPosition varchar2(50);
      Begin

        weightArray('Cost Weighting')    := costWeight;
        weightArray('Quality Weighting') := qualityWeight;
        weightArray('Service Weighting') := serviceWeight;

        currentPosition := weightArray.first;

        Loop
          Exit When currentPosition is null;
          Insert Into GVS.GVSSD16_DFLT_WEIGHT
            ( cal_year, metric_name, metric_val )
          Values
            ( vYear, currentPosition, weightArray(currentPosition) ); 

          currentPosition := weightArray.next(currentPosition);
        End Loop;
      END;

在我写它的时候,它只是做一个 INSERT。但是,我需要它来 UPSERT。我查看了有关 MERGE 的文档,但主要是让我对如何将语法应用于我的特定案例感到困惑。

我查看了 herehere 并明白了其中的要点,但语法失败了。

有人愿意帮助 Oracle 新手吗?

【问题讨论】:

    标签: oracle plsql upsert


    【解决方案1】:

    假设 cal_year 和 metric_name 定义了连接条件,这应该会让你接近(未经测试):

    MERGE INTO GVS.GVSSD16_DFLT_WEIGHT d
         USING (SELECT vYear AS YY,
                       currentPosition AS POS,
                       weightArray (currentPosition) AS WA
                  FROM DUAL) v
            ON (d.cal_year = v.YY AND d.metric_name = v.pos)
    WHEN MATCHED
    THEN
       UPDATE SET metric_val = v.WA
    WHEN NOT MATCHED
    THEN
       INSERT     (cal_year, metric_name, metric_val)
           VALUES (v.YY, v.POS, v.WA);
    

    【讨论】:

    • 该死的近乎完美。只需要在 ON 条件周围加上括号。感谢您的帮助。
    猜你喜欢
    • 2019-01-30
    • 2011-08-29
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多