反饋已提交
網絡繁忙
本文介紹填報範本製作、預覽、提交程式中,常見的問題及排查步驟。
根據本文了解了相關報錯可能的原因後,可以採取一些針對性的方式去定位問題,下面列出幾種常用的方法。
對填報屬性進行二分法測試,定位到出問題的欄位,查看其綁定的值是否有問題。
對範本結構進行簡化,刪除不相關的元素,定位出問題點。
在資料庫建立一個簡單的表來測試是否提交成功。
更換其他資料庫來提交測試。
使用 填報除錯插件,協助排查問題。
問題描述:
填報提交時出現報錯:user lacks privilege or object not found
原因分析:
填報入庫的目標資料表被刪除/表名稱變化,導致無法找到目標資料表
解決方案:
1)檢查填報入口的目標資料表是否發生了變更
2)在「報表填報屬性」中修改目標資料庫表名
填報提交時出現報錯:wrong path exists
填報屬性>上傳至伺服器>磁碟路徑填寫錯誤
修改磁碟路徑
填報提交時出現報錯: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
提交入庫的資料中存在陣列
檢查並修正提交入庫的資料
填報提交時出現報錯:data truncation,data too long for column
資料庫欄位長度太短,填報入庫的資料長度超過了限制
調大數據庫欄位長度
填報提交時出現報錯:將截斷字串或二進制資料
填報提交時出現報錯:No operations allowed after statement closed
排查步驟一:
資料庫表設定了外鍵約束,例如restrict,此設定會影響填報。取消外鍵約束
排查步驟二:
帳號權限問題,資料連結所用的使用者只有查詢權限,沒有寫入權限,請檢查並修改對應的使用者權限
填報提交時出現報錯:無法獲取未定義或null引用的屬性'formsubmit'
無法獲取未定義或null引用的屬性'XXX'是IE特有的報錯,是老版本IE不相容導致
建議升級IE瀏覽器版本,或更換為其他瀏覽器
填報提交時出現報錯:Unknown column 'Name' in 'field list'
目標資料庫不存在填報欄位
修改填報屬性的欄位
填報提交時出現報錯: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 類型。
填報提交時出現報錯: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';查看鎖等待時間,一般預設為50s2)在MySQL中輸入select * from information_schema.innodb_trx語句查看鎖等待的執行緒id
3)執行kill 執行緒id,即可殺死該執行緒。
解決方案二:修改鎖等待時間
例如修改鎖等待時間為200s,可使用該語句:
SET GLOBAL innodb_lock_wait_timeout=200;
解決方案三:清理臨時表
對MySQL臨時表資料進行清理
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%';」 語句查看是否修改成功。
MySQL 資料庫填報入庫失敗,報錯:Unknown column'??'in 'field list'
編碼問題,無法識別欄位
在資料連結URL後面規定下編碼方式?useUnicode=true&characterEncoding=UTF-8
資料填報到MySQL資料庫,提交時報錯「incorrect string value:'xf0x9f」
提交的資料中帶有Emoji表情或者某些特殊字元,是4個位元組,而Mysql的utf8編碼最多3個位元組,所以資料插不進去。
修改mysql的my.ini檔案:[mysqld]
重啟mysql服務後就可以正常插入了。
同樣的範本,其他資料庫正常,只有Mysql資料庫提交非常慢。
Mysql預設禁用了批量提交。
在資料連結的url後增加&rewriteBatchedStatements=true參數。
填報提交時出現報錯:ORA-00001 違反唯一約束條件(欄位)
Oracle資料庫主鍵衝突報錯
1)確認主鍵個數
2)檢查填報時是否有重複錄入的情況
填報提交時出現報錯:ORA-00942:表或檢視表不存在
1)填報的表/欄位不存在/重新命名了
2)Oracle資料庫大小寫敏感,在定義表名稱/列名稱時,如果沒有用引號引起來,Oracle會將其轉換為大寫,此時就會出現錯誤
檢查填報入口的目標資料表是否發生了變更
填報提交時出現報錯:ORA-01031 權限不足
資料庫設定了權限,限制了增刪改sql語句的執行
給資料連結使用的使用者賦權限
填報提交時出現報錯:ORA-01722
填報欄位類型不匹配,將字串內容填報到了number類型的資料庫欄位中
修改資料庫的欄位類型
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
填報對應資料連結的使用者是sys,sys是資料庫內設的超使用者
請將資料連結的帳號修改為sys as sysdba
DB2資料庫填報入庫失敗,報錯:ERRORCODE=-4229,SQLSTATE=null
原因分析:資料庫欄位設定禁止為空,但是填報的資料中存在空值
解決方案:避免填報空值
原因分析:char欄位類型導致,char是定長資料類型,資料庫會自動補上空格,導致入庫內容與填報內容不一致,進而報錯
解決方案:更改為varchar欄位
排查步驟三:
原因分析:資料庫表狀態異常/表被鎖住
解決方案:檢查資料庫表狀態
postgresql資料庫填報入庫失敗,報錯:批次處理xxx被中止,呼叫 getNextException 以取得原因
不支援postgresql的interval欄位類型填報
欄位類型修改為varchar(n)
填報提交時出現報錯:JZ006: 擷取到 IO 例外:java.io.IOException
填報提交的目標資料庫為IQ資料庫/sybase資料庫,且填報提交資料條數大於1000條
填報範本預覽連結URL後面加上&jconnect_version=6
填報提交時出現報錯:Cannot parallelize an UPDATE statement that updates the distribution column
填報提交的目標資料庫為GP資料庫
1)此次填報提交對資料庫的主鍵造成了更新操作
2)資料庫主鍵為自增長ID,不應當在填報屬性中設定該主鍵欄位
解決方法:
1)檢查是否對資料庫的主鍵做了更新操作
2)檢查資料庫主鍵是否為自增長id,是的話不需要在填報屬性中設定該欄位
填報提交時出現報錯:parameter metadata not populated
impala不支援填報,因為資料庫本地不支援修改和更新資料
填報提交時可以入庫,但是會出現報錯: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
填報提交時出現報錯:ClickHouse exception, code: 62
填報提交的目標資料庫為Clickhouse資料庫
Clickhouse資料庫本身不支援 UPDATE 和 DELETE 操作
填報提交類型改成插入
使用 Clickhouse 資料庫進行填報時,點選「提交」會彈出一個報錯,如下圖所示:
Clickhouse 資料庫 UPDATE 和 DELETE 操作和標準的資料庫刪改文法不同,不支援使用。
支援使用的文法格式可參考 報表填報屬性簡介 2.1節。
設定「報表填報屬性」時,提交類型選擇「插入提交」。
使用阿里雲的 hologres 產品(類似資料庫),可正常查詢資料,但是填報使用「內建SQL」提交類型時,點選「提交」會彈出一個報錯,如下圖所示:
hologres 產品本身不支援交易中執行 insert 語句。
填報提交的時候使用「自訂提交」方式,透過寫程式碼的方式執行 insert 語句。
阿里雲的ADB資料庫使用智慧提交時,無法新增資料。使用插入提交正常。
ADB3.0以上版本更新了資料庫機制,導致本應該插入的資料在傳回影響行數的時候,從0變為了1,所以後續就不會執行插入了。
在ADB的console裏找到RC_UPDATE_AUTO_CONVERT_ENABLE參數,將其設定為false即可。如果沒有該參數,則需要手動新增。
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙