---
title: 执行 SQL 报 -6226 错误-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于执行 SQL 报 -6226 错误相关的常见问题和使用技巧，帮助您快速解决执行 SQL 报 -6226 错误的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# 执行 SQL 报 -6226 错误

更新时间：2026-05-26 09:46

适用版本： V2.2.x、V3.1.x、V3.2.x 内容类型：Troubleshoot  

## 问题描述

执行包含 UDF 的弱读 SELECT (不能在只读事务中执行语句) 报错。

```shell
-6226: ERROR 1792 (25006): OB-1792:Cannot execute statement in a READ ONLY transaction

```

## 问题原因

问题 SQL 包含自定义函数 `SETTLE.BI_MYJS_GJ`，自定义函数是抽数专用，其中没有 UPDATE 操作。

1. 执行如下语句。

   ```shell
   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；

   ```
 2. 创建自定义函数。

   ```shell
   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) 版本。

上一篇

[query range 抽取报错 4016](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000245503)

下一篇

[查询语句中使用分隔符（SEPARATOR）导致执行慢的原因和解决方法](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000001680373) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
