我目前正在使用 Data Vault 建模对数据仓库进行建模。我的问题如下:我想根据业务密钥为每个卫星定义最后一个状态。以下是我想要实施的元素和算法:
我有两张桌子。
第一个表 (SAT) 包含事件的历史记录,其主键由业务键和此业务键的更新日期组成。该表是实时供电的。
第二个表 (LAST_SAT) 包含每个事件的最后状态,其主键仅包含业务键。更新日期是第一个表的最大更新日期。这张桌子每天喂一次。
这是我想在 PL/SQL 中实现的算法:
对于每个卫星对 (SAT) 和最后一个状态卫星 (LAST_SAT):
- 标识 LAST SAT 的最后更新日期(如果由于表为空而返回为零,则值为 01/01/1900):MAX_DATE
- 选择在 MAX_DATE 之后更新的 SAT 表中的数据。
将所选数据 (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;
你能帮我实现目标吗?
先感谢您,
纪尧姆。