比较两个表之间的计数,即使其中一个表在oracle中没有记录。

问题描述 投票:0回答:1

我陷入了一个难题。我需要比较2的计数,并根据比较结果更新其中一个表格。以下是详细情况。

我有两个表:dwh_idh_to_iva_metadata_t和lnd_sml_price_t.每天都有一个包在运行,它将数据从源表dwh_sml_price_t加载到目的表lnd_sml_price_t。这个包还会检查 "dwh_idh_to_iva_metadata_t "和 "lnd_sml_price_t "表之间的计数。如果计数匹配,那么它就会更新表 dwh_idh_to_iva_metadata_t 中的几个列,如果计数不匹配,那么这个包就会抛出一个异常并退出。为了进行计数比较,我们创建了一个游标,然后获取该游标进行比较。游标的代码如下。

CURSOR C_CNT_PRICE IS
     SELECT
        lnd.smp_batchrun_id batch_id,
        lnd.lnd_count,
        dwh.dwh_count
     FROM
        (
          SELECT
            smp_batchrun_id,
            COUNT(*) lnd_count
          FROM
            iva_landing.lnd_sml_price_t
          GROUP BY
            smp_batchrun_id
        ) lnd
     LEFT JOIN (
        SELECT
            batchrun_id,
            sent_records_count dwh_count,
            dwh_sending_table
        FROM
        dwh.dwh_idh_to_iva_metadata_t
        ) dwh ON dwh.batchrun_id = lnd.smp_batchrun_id
        WHERE
        dwh.dwh_sending_table = 'DWH_SML_PRICE_T'
    ORDER BY
    1 DESC;    `

而实际的比较代码是:

`    FOR L_COUNT IN C_CNT_PRICE LOOP       --0001,0002
          IF L_COUNT.lnd_count = L_COUNT.dwh_count THEN
            UPDATE DWH.DWH_IDH_TO_IVA_METADATA_T idh
            SET idh.IVA_RECEIVING_TABLE = 'LND_SML_PRICE_T',
            idh.RECEIVED_DATE = SYSDATE,
            idh.RECEIVED_RECORDS_COUNT = L_COUNT.lnd_count,
            idh.status = 'Verified'
            WHERE L_COUNT.batch_id = idh.batchrun_id
            AND idh.dwh_sending_table = 'DWH_SML_PRICE_T';
            COMMIT;
          ELSE
            RAISE  EXCPT_MISSDATA;  -- Throw error and exit process immediately
          END IF;
       END LOOP;    `

现在,问题是在某些情况下 "LND_SML_PRICE_T "表没有任何数据,在这种情况下,DWH_IDH_TO_IVA_METDATA_T应该更新列,就像在计数比较时一样。

我需要帮助修改代码,以便在LND_SML_PRICE_T表中没有记录的情况下也能进行比较。

谢谢!我遇到了一个难题。

sql oracle plsql
1个回答
0
投票

如果表中没有记录 LND_SML_PRICE_T 表格、光标 C_CNT_PRICE's LND_COUNT 等于 0 这意味着,比较代码应该修改为

FOR L_COUNT IN C_CNT_PRICE LOOP
      IF (L_COUNT.lnd_count = L_COUNT.dwh_count) 
         or L_COUNT.lnd_count = 0                     --> this
      THEN
© www.soinside.com 2019 - 2024. All rights reserved.