首先,我知道ORA-000937是一个常见的问题,有一个明显的答案,但我还没有找到任何可能指出可能解决方案的结果。
快速规格; 国家结核病/艾滋病毒报告,根据患者的医疗记录/遭遇/访问和提供的药物。这只是报告的一小部分,它循环所有患者药物,并计算其中大部分数字的计算日期,我们不存储历史/汇总数据,所有内容在请求时汇总。我之所以提到这一点,是因为我希望有一些建议可以摆脱GTT,而不是使用MVIEW - 我听到了,但不是,不是解决方案。
这是我的问题,这是我在函数中填充GTT的一个查询,它存储聚合结果。我已经构建了我的数据收集,以减少服务器负载,因为医疗表超过1200万条记录。 (每位患者默认3次。)
这是GTT
CREATE GLOBAL TEMPORARY TABLE EKAPAII.TEMP_ART_VISIT_MEDS
(
EPISODE_ID NUMBER,
LAST_MEDS_DATE DATE
)
ON COMMIT DELETE ROWS
RESULT_CACHE (MODE DEFAULT)
NOCACHE;
CREATE UNIQUE INDEX EKAPAII.TEMP_ART_VISIT_MEDS_PK ON EKAPAII.TEMP_ART_VISIT_MEDS
(EPISODE_ID);
ALTER TABLE EKAPAII.TEMP_ART_VISIT_MEDS ADD (
CONSTRAINT TEMP_ART_VISIT_MEDS_PK
PRIMARY KEY
(EPISODE_ID)
USING INDEX EKAPAII.TEMP_ART_VISIT_MEDS_PK
ENABLE VALIDATE);
我的简单插入查询
INSERT INTO temp_art_visit_meds (EPISODE_ID, LAST_MEDS_DATE)
SELECT episode_id, encounter_date + number_of_days
FROM ( SELECT enc_meds.episode_id,
MAX (enc_meds.encounter_date) encounter_date,
MAX (
CASE
WHEN (NVL (meds.number_of_days, 0) > 150)
THEN
90
ELSE
NVL (meds.number_of_days, 0)
END)
number_of_days
FROM temp_art_visit enc_meds,
vd_medication meds,
dl_drugs_episode_class dlc,
( SELECT latest_meds_visit.episode_id,
MAX (latest_meds_visit.encounter_date)
encounter_date
FROM temp_art_visit latest_meds_visit,
vd_medication latest_meds,
dl_drugs_episode_class dc
WHERE latest_meds_visit.encounter_id =
latest_meds.encounter_id
AND latest_meds.drug_id = dc.drug_id
AND dc.sd_drug_application_id = 8401
GROUP BY latest_meds_visit.episode_id) latest_meds
WHERE enc_meds.encounter_id = meds.encounter_id
AND enc_meds.episode_id = latest_meds.episode_id
AND enc_meds.encounter_date =
latest_meds.encounter_date
AND meds.drug_id = dlc.drug_id
AND dlc.sd_drug_application_id = 8401
AND meds.active_flag = 'Y'
GROUP BY enc_meds.episode_id);
现在我的错误是,ORA-000937不是单组组功能,但是如果我在普通的编辑器窗口中运行这个查询就可以了,但是当我在包体本身执行select查询时,我得到了ORA-000937,调用该函数不会返回任何错误,即使我有一个异常块来处理任何错误。
任何帮助都可以,我明白这个错误只能在运行时发生,而不是在编译时发生?或者我是从pl / sql块运行查询的事实吗?
Toad for Oracle 12.5版 - 尽管它的荣耀。 (讽刺)
再次,请原谅我,如果已经被要求/回答了。
编辑 - 解决方案
因此,经过几个小时的故障排除后,我能够理解为什么会产生这个错误。首先是固定查询;
INSERT INTO temp_art_visit_meds (EPISODE_ID, LAST_MEDS_DATE)
SELECT enc_meds.episode_id ,
TRUNC( MAX (enc_meds.encounter_date)) + MAX (CASE WHEN (NVL (meds.number_of_days, 0) > 150) THEN 90 ELSE NVL (meds.number_of_days, 0) END) last_meds_date
FROM temp_art_visit enc_meds,
vd_medication meds,
dl_drugs_episode_class dlc,
( SELECT latest_meds_visit.episode_id,
MAX (latest_meds_visit.encounter_date) encounter_date
FROM temp_art_visit latest_meds_visit,
vd_medication latest_meds,dl_drugs_episode_class dc
WHERE latest_meds_visit.encounter_id = latest_meds.encounter_id
AND latest_meds.drug_id = dc.drug_id
AND dc.sd_drug_application_id = 8401
GROUP BY latest_meds_visit.episode_id) latest_meds
WHERE enc_meds.encounter_id = meds.encounter_id
AND enc_meds.episode_id = latest_meds.episode_id
AND enc_meds.encounter_date = latest_meds.encounter_date
AND meds.drug_id = dlc.drug_id
AND dlc.sd_drug_application_id = 8401
AND meds.active_flag = 'Y'
GROUP BY enc_meds.episode_id, meds.number_of_days, enc_meds.encounter_date;
看起来问题是由于子查询的数量,我试图使用不同的提示优化器而无济于事。如果仔细查看第一个查询,您会注意到我基本上汇总了聚合结果的结果,因此列的encounter_date,episode_id,number_of_days不再“可用”,所以即使我在上一次添加了相应的GROUP BY子句(外部)子查询,Oracle将无法对这些列名称/标识符进行分组。
我不确定为什么这只会在PACKAGE BODY中失败,并且在执行时没有返回任何SQLERR或SQLCODE。
快乐的日子。