0

我目前正在使用 Data Vault 建模对数据仓库进行建模。我的问题如下:我想根据业务密钥为每个卫星定义最后一个状态。以下是我想要实施的元素和算法:

我有两张桌子。

第一个表 (SAT) 包含事件的历史记录,其主键由业务键和此业务键的更新日期组成。该表是实时供电的。

第二个表 (LAST_SAT) 包含每个事件的最后状态,其主键仅包含业务键。更新日期是第一个表的最大更新日期。这张桌子每天喂一次。

这是我想在 PL/SQL 中实现的算法:

对于每个卫星对 (SAT) 和最后一个状态卫星 (LAST_SAT):

  1. 标识 LAST SAT 的最后更新日期(如果由于表为空而返回为零,则值为 01/01/1900):MAX_DATE
  2. 选择在 MAX_DATE 之后更新的 SAT 表中的数据。
  3. 将所选数据 (2) 与 LAST_SAT 数据进行比较,以使用新的和更新的数据更新 LAST_SAT。

    3.a. 从 SAT 中存在的 LAST_SAT 中删除数据(根据业务密钥)

    3.b。将选定的数据 (2) 以有序的方式插入 LAST_SAT。

这是我开始用PL/SQL编写的程序,但是我的水平太低,无法做到这一点。

/* Formatted on 29/07/2019 15:25:07 (QP5 v5.185.11230.41888) */

DECLARE
   v_maxVal       VARCHAR2 (200);
   requete        VARCHAR2 (200);
   TYPE TabCur IS REF CURSOR;
   v_tab_cursor   TabCur;
BEGIN
   FOR sat IN (SELECT table_name, column_name
                 FROM USER_TAB_COLUMNS
                WHERE column_name LIKE '%UPDATE%' AND table_name = 'S_SALE'
                                                                       )
   LOOP

      EXECUTE IMMEDIATE 'SELECT MAX(' ||sat.column_name || ') FROM ' || 'LS_'|| substr(sat.table_name,1,29) INTO v_maxVal;

      requete := 'SELECT * FROM '|| sat.table_name || ' WHERE '|| sat.column_name || ' >= ''' || v_maxVal || '''';

      OPEN v_tab_cursor FOR requete;

      LOOP

            FETCH v_tab_cursor INTO rec;

        EXIT WHEN v_tab_cursor%NOTFOUND;

        DBMS_OUTPUT.PUT_LINE(rec.CONT_CONT_CONTRAT_REF);

      END LOOP;

      CLOSE v_tab_cursor;



      --DBMS_OUTPUT.put_line (sat.table_name || ' -> ' || sat.column_name || ' : ' || v_maxVal);

   --DBMS_OUTPUT.put_line (sat.table_name || ' : ' || v_maxVal);

   END LOOP;

END;

你能帮我实现目标吗?

先感谢您,

纪尧姆。

4

0 回答 0