首批通过分布式安全可靠测评,为关键业务系统打造
执行 SQL 报 -6226 错误
更新时间:2026-05-26 09:46
问题描述
执行包含 UDF 的弱读 SELECT (不能在只读事务中执行语句) 报错。
-6226: ERROR 1792 (25006): OB-1792:Cannot execute statement in a READ ONLY transaction
问题原因
问题 SQL 包含自定义函数 SETTLE.BI_MYJS_GJ,自定义函数是抽数专用,其中没有 UPDATE 操作。
执行如下语句。
obclient > SELECT /*+ read_consistency(weak)*/ LX,WJM,HDRQ,TO_CHAR(JS_TIME, 'YYYYMMDDHH24MISS'),JSDX,CALL_TYPE,HDS,THSC,JFSC,JFCS,MYF,CTF,CTF2,settle.BI_MYJS_GJ('MYF', LX, CALL_TYPE, MYF, CTF, CTF2) AS FIN_MYF,settle.BI_MYJS_GJ('CTF', LX, CALL_TYPE, MYF, CTF, CTF2) AS FIN_CTF,settle.BI_MYJS_GJ('CTF2', LX, CALL_TYPE, MYF, CTF, CTF2) AS FIN_CTF2,settle.BI_MYJS_GJ('SUM', LX, CALL_TYPE, MYF, CTF, CTF2) AS FIN_SUM,ERROR_TYPE,JSFS,JSYF,' ' AS FILE_DATE,SERVICE_TYPE,BY1 FROM SETTLE.ROAM_STAT_INT_SZX WHERE to_char(js_time, 'YYYYMMDD') = 20221029;创建自定义函数。
CREATE OR replace FUNCTION "SETTLE"."BI_MYJS_GJ" ( "I_ITEMNAME" IN varchar2, "I_LX" IN varchar2, "I_CALLTYPE" IN varchar2, "I_MYF" IN number, "I_CTF" IN number, "I_CTF2" IN number ) RETURN number IS result number;Rate1 number;Rate2 number;Fee1 number;Fee2 number;Fee3 number;BEGIN SELECT Nvl(rate_value1,1) , Nvl(rate_value2,1) INTO rate1, rate2 FROM settle.cfg_roam_report_rate WHERE report_id=10003; SELECT Decode(Substr(i_lx,-1,1),'2',-1,'1',-1,1)*i_myf*rate1 INTO fee1 FROM dual; SELECT Decode(Substr(i_lx,-1,1),'2',-1,'1',-1,1)*Decode(i_calltype,'01',1,'03',1,0)*i_ctf*rate1 INTO fee2 FROM dual; SELECT Decode(Substr(i_lx,-1,1),'2',-1,'1',-1,1)*Decode(i_calltype,'01',1,'03',1,0)*i_ctf2*rate1 INTO fee3 FROM dual; IF i_itemname='MYF' then result := fee1; ELSE IF i_itemname='CTF' then result := fee2; ELSE IF i_itemname='CTF2' then result := fee3; ELSE IF i_itemname='SUM' then result := fee1+fee2+fee3; ELSE RESULT:=0; ENDIF; ENDIF; ENDIF; ENDIF; RETURN(result); END
在 MySQL 语法中,SELECT 语句的 UDF 可以包含 UPDATE 操作。如果 SELECT 语句本身是弱读或者在只读事务中,而 UDF 包含 UPDATE 操作,则会报 -6226 错误。
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
解决方法
升级至问题已修复版本,目前已修复如下版本: OceanBase 数据库企业版 V2.2.77 BP16 (oceanbase-2.2.77-116000022023021412) 版本、V3.1.2 BP11 (oceanbase-3.1.2-111000052023010412) 版本、V3.2.3 BP8 (oceanbase-3.2.3.3-108000062023041511) 版本、V3.2.4 BP2 (oceanbase-3.2.4.2-102000042023022717) 版本。