反饋已提交

網絡繁忙

填報常見報錯程式碼

概述

本文介紹填報範本製作、預覽、提交程式中,常見的問題及排查步驟。

排查方法

根據本文了解了相關報錯可能的原因後,可以採取一些針對性的方式去定位問題,下面列出幾種常用的方法。

  • 對填報屬性進行二分法測試,定位到出問題的欄位,查看其綁定的值是否有問題。

  • 對範本結構進行簡化,刪除不相關的元素,定位出問題點。

  • 在資料庫建立一個簡單的表來測試是否提交成功。

  • 更換其他資料庫來提交測試。

  • 使用 填報除錯插件,協助排查問題。

填報提交通用報錯

常見報錯程式碼


報錯可能原因
1無法將 NULL 插入XX資料庫表設定了某欄位不能為空,但是該欄位提交的資料中存在空值
2check constraint (NASMES.SYS_C0014107) violated提交的資料中存在違反資料庫設定的約束的資料,比如某欄位設定為了主鍵不能有重複值,但是提交的資料中存在重複值
3違反唯一鍵約束
4Violate unique constraint on[***]
5no operation allowed after statement closed資料庫設定了權限,限制了增刪改sql語句的執行
6no operations allowed
7當 IDENTITY_INSERT 設定為 OFF 時,不能為表 'XXX' 中的標識列插入顯式值對自增長 id 進行修改時的報錯,可參考 資料庫自增長ID填報 解決
8無效數字某個提交值和其入庫欄位類型不一致
9成批處理異常
10No value specified for parameter XX
11資料提交錯誤,索引中丟失in 或out
12沒有為參數號XX設定值
13資料欄類型錯誤/不匹配
14FR-Engine-Write_Column_Type_Mismatch
15公式解析錯誤某個公式存在問題
16Task DCL error HiveException: [Error 20132] Error, you should set transaction.type before any DCL statement星環資料庫的報錯,未在 DCL 宣告前定義交易類型,可嘗試在資料連結url後增加 transaction.type=inceptor 參數
17Attempt to do update or delete using transaction manager that does not support these operationshive 資料庫中沒有開啟 update 和 delete 操作,需要在資料庫開啟
18沒有為參數號設定值檢查填報屬性的「內建SQL」提交設定中,「值」是否都已配置且配置正確

19ORA-02050填報後觸發了不支援的資料庫分佈式交易
20Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='資料庫中資料表的編碼方式不一致,在取數後無法進行比較,導致提交失敗。解決方案可參考:https://help.fanruan.com/finereport/doc-view-3185.html#48e5560ff7af80f4
21存在笛卡爾積部分填報儲存格的父子格關係異常,造成了陣列*陣列的結構。可以按照報錯中提示的欄位定位具體儲存格,修改父子格解決

user lacks privilege or object not found

點選展開更多

問題描述:

填報提交時出現報錯:user lacks privilege or object not found

原因分析:

填報入庫的目標資料表被刪除/表名稱變化,導致無法找到目標資料表

解決方案:

1)檢查填報入口的目標資料表是否發生了變更

2)在「報表填報屬性」中修改目標資料庫表名

wrong path exists

點選展開更多

問題描述:

填報提交時出現報錯:wrong path exists

原因分析:

填報屬性>上傳至伺服器>磁碟路徑填寫錯誤

解決方案:

修改磁碟路徑

Field 'ID' doesn't have a default value

點選展開更多

問題描述:

填報提交時出現報錯:Field 'ID' doesn't have a default value

原因分析:

報錯的「ID」欄位是主鍵,填報的時候沒有為ID設定對應值

解決方案:

1)在資料庫中為ID欄位設定自增長

2)填報時填報ID欄位

java.util.ArrayList cannot be cast to com.fr.stable.write.WriteCellAble

點選展開更多

問題描述:

填報提交時出現報錯:java.util.ArrayList cannot be cast to com.fr.stable.write.WriteCellAble

原因分析:

提交入庫的資料中存在陣列

解決方案:

檢查並修正提交入庫的資料

data truncation,data too long for column

點選展開更多

問題描述:

填報提交時出現報錯:data truncation,data too long for column

原因分析:

資料庫欄位長度太短,填報入庫的資料長度超過了限制

解決方案:

調大數據庫欄位長度

將截斷字串或二進制資料

點選展開更多

問題描述:

填報提交時出現報錯:將截斷字串或二進制資料

原因分析:

資料庫欄位長度太短,填報入庫的資料長度超過了限制

解決方案:

調大數據庫欄位長度

No operations allowed after statement closed

點選展開更多

問題描述:

填報提交時出現報錯:No operations allowed after statement closed

排查步驟一:

資料庫表設定了外鍵約束,例如restrict,此設定會影響填報。取消外鍵約束

排查步驟二:

帳號權限問題,資料連結所用的使用者只有查詢權限,沒有寫入權限,請檢查並修改對應的使用者權限

無法獲取未定義或null引用的屬性'formsubmit'

點選展開更多

問題描述:

填報提交時出現報錯:無法獲取未定義或null引用的屬性'formsubmit'

原因分析:

無法獲取未定義或null引用的屬性'XXX'是IE特有的報錯,是老版本IE不相容導致

解決方案:

建議升級IE瀏覽器版本,或更換為其他瀏覽器

Unknown column 'Name' in 'field list'

點選展開更多

問題描述:

填報提交時出現報錯:Unknown column 'Name' in 'field list'

原因分析:

目標資料庫不存在填報欄位

解決方案:

修改填報屬性的欄位

cannot change this transaction's access mode from read-only to update directly

點選展開更多

問題描述:

填報提交時出現報錯:cannot change this transaction's access mode from read-only to update directly

原因分析:

帆軟預設資料庫隔離級別是可重複度,對於某些資料庫來說太高了。

解決方案:

在 finedb 的 FINE_CONF_ENTITY 表中新增欄位WriteOptimizationConfig.transactionRepeatableRead,欄位值為false,即可將隔離級別調低。

修改方式請參考:填報修改fine_conf_entity

updates on append-only tables are not supported in serializable transactions

點選展開更多

問題描述:

填報提交時出現報錯:cannot change this transaction's access mode from read-only to update directly

原因分析:

帆軟預設資料庫隔離級別是可重複度,對於某些資料庫來說太高了。

解決方案:

在 finedb 的 FINE_CONF_ENTITY 表中新增欄位WriteOptimizationConfig.transactionRepeatableRead,欄位值為false,即可將隔離級別調低。

修改方式請參考:填報修改fine_conf_entity

資料欄類型不匹配

點選展開更多

問題描述

填報時有時候會遇到資料欄類型不匹配的報錯,如下圖所示:

原因分析

第一種可能原因:確認下自己設定填報屬性綁定儲存格列值的時候有沒有出錯,如果錯把資料庫欄位跟標題所在儲存格綁定了會報這個錯;

第二種可能原因:看下資料庫欄位是不是 NUMBER 類型,資料庫欄位類型跟儲存格資料類型不一致導致的。

解決方案

第一種原因:重新綁定資料庫欄位跟填報儲存格;

第二種原因:前端用數字元件,確定是數值類型符合資料庫要求;或者將資料庫欄位修改成 VARCHAR2 類型。

填報到MySQL資料庫報錯

lock wait timeout exceeses ;try restarting transaction

點選展開更多

問題描述:

填報提交時出現報錯:lock wait timeout exceeses ;try restarting transaction

原因分析:

工程中同時填報人數較多,在高併發的情況下,Spring事物造成資料庫死鎖,後續操作逾時丟擲異常。

Mysql資料庫採用InnoDB模式,預設參數:innodb_lock_wait_timeout設定鎖等待的時間是50s,一旦資料庫鎖超過這個時間就會報錯。

解決方案一:殺死鎖等待執行緒

1)在MySQL中輸入SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';查看鎖等待時間,一般預設為50s
2)在MySQL中輸入select * from information_schema.innodb_trx語句查看鎖等待的執行緒id

3)執行kill 執行緒id,即可殺死該執行緒。

解決方案二:修改鎖等待時間

例如修改鎖等待時間為200s,可使用該語句:

SET GLOBAL innodb_lock_wait_timeout=200;

解決方案三:清理臨時表

對MySQL臨時表資料進行清理

Packet for query is too large

點選展開更多

問題描述:

MySQL 資料庫填報入庫失敗,報錯Packet for query is too large ( 4739923 > 1948576). You can change this value on the server by setting the max_ allowed_ packet' variable

原因分析:

MySQL 資料庫中「max_allowed_packet」值設定過小,導致單個記錄超過限制後寫入資料庫失敗,且後續記錄寫入也會失敗。

解決方案一:

MySQL 安裝目錄下的「my.ini」檔案中的[mysqld] 欄位中的「max_allowed_packet = 1M」修改為 500M ,重啟 MySQL 即可。

解決方案二:

1)使用「set global max_allowed_packet = 524288000;」 語句將「max_allowed_packet」的值設定為 500 M。

2)使用「show VARIABLES like '%max_allowed_packet%';」 語句查看是否修改成功。

Unknown column'??'in 'field list'

點選展開更多

問題描述:

MySQL 資料庫填報入庫失敗,報錯:Unknown column'??'in 'field list'

原因分析:

編碼問題,無法識別欄位

解決方案:

在資料連結URL後面規定下編碼方式?useUnicode=true&characterEncoding=UTF-8

incorrect string value

點選展開更多

問題描述:

資料填報到MySQL資料庫,提交時報錯「incorrect string value:'xf0x9f」

原因分析:

提交的資料中帶有Emoji表情或者某些特殊字元,是4個位元組,而Mysql的utf8編碼最多3個位元組,所以資料插不進去。

解決方案:

修改mysql的my.ini檔案:[mysqld]

重啟mysql服務後就可以正常插入了。

Mysql提交慢

點選展開更多

問題描述

同樣的範本,其他資料庫正常,只有Mysql資料庫提交非常慢。

原因分析

Mysql預設禁用了批量提交。

解決方案

在資料連結的url後增加&rewriteBatchedStatements=true參數。

填報到Oracle資料庫報錯

ORA-00001 違反唯一約束條件(欄位)

點選展開更多

問題描述:

填報提交時出現報錯:ORA-00001 違反唯一約束條件(欄位)

原因分析:

Oracle資料庫主鍵衝突報錯

解決方案:

1)確認主鍵個數

2)檢查填報時是否有重複錄入的情況

ORA-00942:表或檢視表不存在

點選展開更多

問題描述:

填報提交時出現報錯:ORA-00942:表或檢視表不存在

原因分析:

1)填報的表/欄位不存在/重新命名了

2)Oracle資料庫大小寫敏感,在定義表名稱/列名稱時,如果沒有用引號引起來,Oracle會將其轉換為大寫,此時就會出現錯誤

解決方案:

檢查填報入口的目標資料表是否發生了變更

ORA-01031 權限不足

點選展開更多

問題描述:

填報提交時出現報錯:ORA-01031 權限不足

原因分析:

資料庫設定了權限,限制了增刪改sql語句的執行

解決方案:

給資料連結使用的使用者賦權限

ORA-01722

點選展開更多

問題描述:

填報提交時出現報錯:ORA-01722

原因分析:

填報欄位類型不匹配,將字串內容填報到了number類型的資料庫欄位中

解決方案:

修改資料庫的欄位類型

ORA-12899: 列 "xxx" 的值太大

點選展開更多

問題描述:

32 位十六進制資料(如GUID)填報到 RAW(16) 資料類型的欄位時,報錯「ORA-12899: 列 "xxx"."xxx"."xxx" 的值太大 (實際值: 32, 最大值: 16)」。如下圖所示:

原因分析:

32 位十六進制字串插入 RAW(16) 時,需要使用 hextoraw() 進行轉換,但是通用 SQL 不好判斷資料庫列是否是 RAW(16) 類型,故無法直接應用 hextoraw 進行轉換。

解決方案:

可以使用函式在入庫前對需插入資料進行轉換,所用函式可以透過自訂函式或者函式插件自訂,現提供一種自訂函式作為參考。自訂函式方法如下:

1)設計器菜單欄點選「伺服器>函式管理器」,自訂一個函式,命名為「transform」,點選「編輯」按鈕,輸入 Java 程式碼,點選「編譯」按鈕,編譯成功後儲存即可,步驟如下圖所示:

Java 程式碼如下:

package com.fr.function;

import com.fr.general.FArray;

import com.fr.general.GeneralUtils;

import com.fr.script.AbstractFunction;

import com.fr.stable.ArrayUtils;

import com.fr.stable.Primitive;

import com.fr.stable.exception.FormulaException;

public class Hex2Raw extends AbstractFunction {

    @Override    

public Object run(Object[] objects) throws FormulaException {

        int len = ArrayUtils.getLength(objects);

        if (len == 0) {

            return Primitive.ERROR_VALUE;

        } 

else if (len == 1) {

            Object item = objects[0];

            if (item instanceof FArray) {

                FArray data = (FArray) item;

                FArray<byte[]> result = new FArray<byte[]>();

                for (Object el : data) {

                    result.add(parseHexString2ByteArray(GeneralUtils.objectToString(el)));

                }

                return result;

            } 

else {

                return parseHexString2ByteArray(GeneralUtils.objectToString(item));

            }

        }

 else {

            FArray<byte[]> result = new FArray<byte[]>();

            for (Object item : objects) {

                result.add(parseHexString2ByteArray(GeneralUtils.objectToString(item)));

            }

            return result;

        }

    }

    public byte[] parseHexString2ByteArray(String hexStr) {

        if (hexStr.length() < 1)

            return new byte[0];

        byte[] result = new byte[hexStr.length() / 2];

        for (int i = 0; i < hexStr.length() / 2; i++) {

            // 兩位為一組轉為十進制

            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);

            // 轉為十進制存入byte陣列

            result[i] = (byte) (high * 16 + low);

        }

        return result;

    }

}

2)設定填報提交時,只需要將入庫的值用公式轉換下即可,如下圖所示:

ORA-28009

點選展開更多

問題描述:

填報提交時出現報錯:ORA-28009

原因分析:

填報對應資料連結的使用者是sys,sys是資料庫內設的超使用者

解決方案:

請將資料連結的帳號修改為sys as sysdba

填報到其他資料庫報錯

ERRORCODE=-4229,SQLSTATE=null

點選展開更多

問題描述:

DB2資料庫填報入庫失敗,報錯:ERRORCODE=-4229,SQLSTATE=null

排查步驟一:

原因分析:資料庫欄位設定禁止為空,但是填報的資料中存在空值

解決方案:避免填報空值

排查步驟二:

原因分析:char欄位類型導致,char是定長資料類型,資料庫會自動補上空格,導致入庫內容與填報內容不一致,進而報錯

解決方案:更改為varchar欄位

排查步驟三:

原因分析:資料庫表狀態異常/表被鎖住

解決方案:檢查資料庫表狀態

批次處理xxx被中止,呼叫 getNextException 以取得原因

點選展開更多

問題描述:

postgresql資料庫填報入庫失敗,報錯:批次處理xxx被中止,呼叫 getNextException 以取得原因

原因分析:

不支援postgresql的interval欄位類型填報

解決方案:

欄位類型修改為varchar(n)

JZ006: 擷取到 IO 例外:java.io.IOException

點選展開更多

問題描述:

填報提交時出現報錯:JZ006: 擷取到 IO 例外:java.io.IOException

原因分析:

填報提交的目標資料庫為IQ資料庫/sybase資料庫,且填報提交資料條數大於1000條

解決方案:

填報範本預覽連結URL後面加上&jconnect_version=6

Cannot parallelize an UPDATE statement that updates the distribution column

點選展開更多

問題描述:

填報提交時出現報錯:Cannot parallelize an UPDATE statement that updates the distribution column

原因分析:

填報提交的目標資料庫為GP資料庫

1)此次填報提交對資料庫的主鍵造成了更新操作

2)資料庫主鍵為自增長ID,不應當在填報屬性中設定該主鍵欄位

解決方法:

1)檢查是否對資料庫的主鍵做了更新操作

2)檢查資料庫主鍵是否為自增長id,是的話不需要在填報屬性中設定該欄位

parameter metadata not populated

點選展開更多

問題描述:

填報提交時出現報錯:parameter metadata not populated

原因分析:

impala不支援填報,因為資料庫本地不支援修改和更新資料

Could not commit to Dtabase:tmp Error to commit

點選展開更多

問題描述:

填報提交時可以入庫,但是會出現報錯:Could not commit to Dtabase:tmp Error to commit

原因分析:

填報提交的目標資料庫為星環資料庫

使用者在資料庫建立表的時候,建立的是ORC交易表。

預設情況下Inceptor關閉Transaction Mode,要對ORC表進行異動處理。

使用者需要透過設定參數開啟ORC表對應的Transaction Mode。

解決方案:

在對應資料連結的URL後面連接?transaction.type=inceptor,再去執行填報提交就正常了

Error, you should set transaction.type before any DCL statement

點選展開更多

問題描述:

填報提交時可以入庫,但是會出現報錯:Error, you should set transaction.type before any DCL statement

原因分析:

填報提交的目標資料庫為星環資料庫

使用者在資料庫建立表的時候,建立的是ORC交易表。

預設情況下Inceptor關閉Transaction Mode,要對ORC表進行異動處理。

使用者需要透過設定參數開啟ORC表對應的Transaction Mode。

解決方案:

在對應資料連結的URL後面連接?transaction.type=inceptor,再去執行填報提交就正常了

ClickHouse exception, code: 62

點選展開更多

問題描述:

填報提交時出現報錯:ClickHouse exception, code: 62

原因分析:

填報提交的目標資料庫為Clickhouse資料庫

Clickhouse資料庫本身不支援 UPDATE 和 DELETE 操作

解決方案:

填報提交類型改成插入

Query must be like 'INSERT INTO xxx'.Got: UPDATE default

點選展開更多

問題描述:

使用 Clickhouse 資料庫進行填報時,點選「提交」會彈出一個報錯,如下圖所示:


原因分析:

Clickhouse 資料庫 UPDATE 和 DELETE 操作和標準的資料庫刪改文法不同,不支援使用。

支援使用的文法格式可參考 報表填報屬性簡介 2.1節。

解決方案:

設定「報表填報屬性」時,提交類型選擇「插入提交」。

INSERT in transaction is not supported now

點選展開更多

問題描述:

使用阿里雲的 hologres 產品(類似資料庫),可正常查詢資料,但是填報使用「內建SQL」提交類型時,點選「提交」會彈出一個報錯,如下圖所示:


原因分析:

hologres 產品本身不支援交易中執行 insert 語句。

解決方案:

填報提交的時候使用「自訂提交」方式,透過寫程式碼的方式執行 insert 語句。 

ADB資料庫智慧提交無法插入資料

點選展開更多

問題描述:

阿里雲的ADB資料庫使用智慧提交時,無法新增資料。使用插入提交正常。

原因分析:

ADB3.0以上版本更新了資料庫機制,導致本應該插入的資料在傳回影響行數的時候,從0變為了1,所以後續就不會執行插入了。

解決方案:

在ADB的console裏找到RC_UPDATE_AUTO_CONVERT_ENABLE參數,將其設定為false即可。如果沒有該參數,則需要手動新增。


附件列表


主題: 填報應用
已經是第一篇
已經是最後一篇
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙