【发布时间】:2014-11-17 06:29:04
【问题描述】:
我不太了解此处找到的解决方案: Selecting Values from Oracle Table Variable / Array?
我有一个表名列表。我想将它们作为一个数组循环,使用它们的值作为表进行搜索。
TMP_DORMANT_FILTERS 物理表的表名。下面的数组是同一个列表。 LM_DORMANT_EMAIL 是电子邮件地址列表。
我想检查表格列表中是否存在休眠电子邮件地址。我意识到我可以编写 12 次相同的查询来搜索每个表。但这不会提高我的 SQL 技能。
这是我的数组尝试。在这次尝试中,Oracle 不喜欢我在 where not exists sql 中调用数组值的方式:
DECLARE
TYPE array_t IS VARRAY(12) OF VARCHAR2(25);
ARRAY array_t := array_t('BT_ABANDONED_HIST', 'BT_BROWSED_HIST', 'BT_PURCHASED_HIST', 'CM_ABANDONED_HIST', 'CM_BROWSED_HIST', 'CM_PURCHASED_HIST', 'CM_PAGE_VIEWS_HIST', 'MB_ABANDONED_HIST', 'MB_BROWSED_HIST', 'MB_CARTED_HIST', 'MB_PAGE_VIEWS_HIST', 'MB_PURCHASED_HIST');
BEGIN
FOR i IN 1..array.count LOOP
INSERT INTO TMP1_DORMANT_EMAIL
SELECT feed.EMAIL_ADDRESS
FROM LM_DORMANT_EMAIL feed
WHERE NOT EXISTS (
SELECT 1 FROM array(i) hist
WHERE ACTIVITY_DATE >= TRUNC(SYSDATE - 90)
AND hist.EMAIL = feed.EMAIL_ADDRESS
);
COMMIT;
END LOOP;
END;
/
或者使用上面链接中的解决方案,我试过了。 Oracle 无法识别我在开始部分下插入 dormant_filters 的内容。它告诉我我的物理表 TMP_DORMANT_FILTERS 不存在:
CREATE GLOBAL TEMPORARY TABLE dormant_filters
( filters varchar2(100)
)
ON COMMIT DELETE ROWS;
BEGIN
INSERT INTO dormant_filters
( filters )
( SELECT TABLE_NAMES
FROM TMP_DORMANT_FILTERS
);
FOR j IN ( SELECT filters FROM dormant_filters ) LOOP
INSERT INTO TMP1_DORMANT_EMAIL
SELECT feed.EMAIL_ADDRESS, j as DORMANT_SOURCE
FROM LM_DORMANT_EMAIL feed
WHERE NOT EXISTS (
SELECT 1 FROM j hist
WHERE feed.ACTIVITY_DATE >= TRUNC(SYSDATE - 90)
AND hist.EMAIL = feed.EMAIL_ADDRESS
);
NULL;
END LOOP;
COMMIT;
END;
/
【问题讨论】:
标签: oracle