关于 ORA-00937: 非单组分组函数 异常

本文介绍了在 Oracle 数据库中使用 SQL 时如何正确应用分组以避免异常。特别是当查询涉及聚合函数与多个列时,需明确指定 GROUP BY 子句来确保查询的有效性。

如果选取列中包含一列是聚合函数执行结果,同时选取列多于一列时,需要指定分组,否则就会出现标题的ORACLE异常.

如:

select sum(col1),col2 from table1

执行该语句时会出现标题异常.

解决后:

select sum(col1),col2 from table1 group by col2

 

报错ORA-06512: at "SAJET.SP_UPDATE_ASSYLPBD7_ALL", line 104 ORA-06512: at "SAJET.SP_UPDATE_ASSYLPBD7_ALL", line 54 协助修正如下Oracle的PROCEDURE: CREATE OR REPLACE PROCEDURE SAJET.SP_UPDATE_ASSYLPBD7_ALL IS ------------------------------------------------------------------------------------------------------ -- 功能說明 : 更新ORT组立机台状态LPBD7 -- 建立日期 : 2025/9/25 -- 建立人員 : 刘羽佳 ------------------------------------------------------------------------------------------------------ V_MSG VARCHAR2(1000); V_RESULT VARCHAR2(500); BEGIN -- 清空临时表(确保会话隔离) EXECUTE IMMEDIATE 'TRUNCATE TABLE SAJET.TMP_ORT_DATA'; -- 一次性处理所有序列类型(修复VALUE2来源) INSERT INTO SAJET.TMP_ORT_DATA WITH patterns AS ( SELECT UPPER(REGEXP_REPLACE(VALUE1, '[^a-zA-Z0-9 .-]', '')) cleaned_value, VALUE2 -- 添加VALUE2到patterns FROM LPBD7.U_PARAMETER_FILE WHERE CONDITION1 = 'ORT_EBORD' AND ACTIVE = 'Y' ), ort_records AS ( SELECT COALESCE(A.SERIALS_BAND, A.SERIALS_SP, A.SERIALS_BG, A.SERIALS_FG) AS serial_value, P.VALUE2, -- 从patterns获取VALUE2 A.EVENT FROM LPBD7.AGENCY_LOGS_ORT A JOIN patterns P ON INSTR( UPPER(REGEXP_REPLACE(A.TEST_NAME, '[^a-zA-Z0-9 .-]', '')), P.cleaned_value ) > 0 WHERE A.CREATED >= CASE WHEN SYSDATE BETWEEN TRUNC(SYSDATE) + 8.5/24 AND TRUNC(SYSDATE) + 20.5/24 THEN TRUNC(SYSDATE) + 8.5/24 WHEN SYSDATE BETWEEN TRUNC(SYSDATE) + 20.5/24 AND TRUNC(SYSDATE+1) THEN TRUNC(SYSDATE) + 20.5/24 ELSE TRUNC(SYSDATE - 1) + 20.5 / 24 END ) SELECT serial_value, VALUE2, SUM(CASE WHEN EVENT != 'pass' THEN 1 ELSE 0 END) ng_cnt, SUM(CASE WHEN EVENT = 'pass' THEN 1 ELSE 0 END) ok_cnt, CASE WHEN SUM(CASE WHEN EVENT != 'pass' THEN 1 ELSE 0 END) > 0 THEN 'NG' ELSE 'OK' END test_result FROM ort_records GROUP BY serial_value, VALUE2; -- 批量更新机器数据(修复表不存在错误) MERGE INTO SAJET.TC_ASSY_MACHINE M USING ( SELECT M.ROWID AS rid, T.serial_value, T.ng_cnt, T.ok_cnt, T.test_result FROM SAJET.TMP_ORT_DATA T JOIN ( SELECT /*+ MATERIALIZE */ -- 添加提示优化子查询 DISTINCT A.STATION_ID, D.ADDR, UPPER(C.NAME) process_name FROM LPBD7.AGENCY_LOGS A JOIN MESNEX.AGENCY_JOBS B -- 使用大写模式名 ON B.AGENT = A.AGENT_ID AND A.CREATED BETWEEN B.STARTED AND B.ENDED JOIN MESNEX.AGENCY_PROCESS C ON C.ID = B.PROCESS JOIN LP960.AGENCY_AGENTS D ON A.AGENT_ID = D.ID ) L ON L.process_name = UPPER(T.value2) JOIN SAJET.TC_ASSY_MACHINE M ON M.MACHINE_ID = L.STATION_ID AND M.IP = L.ADDR AND M.PRODUCT = 'LPBD7' AND M.IS_ACTIVE = 'Y' WHERE (M.FILE_PATH = T.serial_value OR NVL(M.ERR_TYPE, 'NG') = 'NG') ) S ON (M.ROWID = S.rid) WHEN MATCHED THEN UPDATE SET M.TARGET_YIELD = S.ng_cnt, M.TARGET_UPTIME = S.ok_cnt, M.ERR_TYPE = S.test_result, M.FILE_PATH = S.serial_value; COMMIT; EXCEPTION WHEN OTHERS THEN V_MSG := SQLERRM; SELECT SAJET.SF_MES_Send_Mail('mes.it@tzlens.com,yujia.liu@tzlens.com', '', 'SP_UPDATE_ASSYLPBD7', V_MSG, '', '') INTO V_RESULT FROM DUAL; RAISE; END;
最新发布
09-27
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值