简体   繁体   English

ORA-01722:无效的号码

[英]ORA-01722: invalid number

I'm getting the infamous invalid number Oracle error. 我得到臭名昭着的无效数字Oracle错误。 Hibernate is issuing an INSERT with a lot of columns, I want to know just the name of the column giving the problem. Hibernate发布了一个包含很多列的INSERT,我只想知道给出问题的列的名称。 Is it possible? 可能吗?

FYI the insert is this: 仅供参考,插入是这样的:

insert into GEM_INVOICE_HEADER 
   (ENDORSEE_ACCOUNT_ID, INVOICE_CODE, APPROVAL_ORGAN, APROVAL_DATE, APROVAL_REFERENCE, BALANCE_BASE_AMOUNT, BALANCE_DEDUCT_AMOUNT, BALANCE_TOTAL_AMOUNT, BALANCE_VAT_AMOUNT, BALANCE_VAT_DED_AMOUNT, BALANCE_VAT_NOT_DED_AMOUNT, DESCRIPTION, SUPPLIER_INVOICE_NUMBER, INVOICE_DATE, RECEIPT_DATE, MEMO, VAT_INTRACOM, INVOICE_BASE_AMOUNT, INVOICE_VAT_AMOUNT, INVOICE_VAT_DED_AMOUNT, INVOICE_VAT_NOT_DED_AMOUNT, INVOICE_DEDUCT_AMOUNT, INVOICE_TOTAL_AMOUNT, VAT_EXEMPT, RECTIFICATION_SIGN, REASON, LOT, FILE_ID, RETAINED, INSTITUTION_ID, PERIOD_CODE, IS_RECTIFIED, DEFAULT_OFFBUDGET_ACCOUNT, OFFBUDGET_DOC_ID, PHASE_OF_ACCOUNTING, ACCOUNTED_OFF_BUDGET, CANCEL_DOC_ID, BUDGET_TYPE, INVOICE_TYPE, SOURCE_ID, STATE_ID, MANAGER_UNIT_ID, DOCUMENT_TYPE_CODE, ACCOUNTED_DOC_ID, ACCOUNTING_LIST, ENDORSEE_ID, PAYMASTER_ID, SUPPLIER_ID, SUPPLIER_ACCOUNT_ID, PAY_JUSTIFY_ID, PETTY_CASH_ID, DBOID) 
values 
   (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Try DBMS_SQL.LAST_ERROR_POSITION 尝试DBMS_SQL.LAST_ERROR_POSITION

It will tell you the character position in the SQL string of the error. 它将告诉您错误的SQL字符串中的字符位置。 Don't know if it will work from Hibernate, but it does from PL/SQL. 不知道它是否可以在Hibernate中运行,但它可以从PL / SQL运行。

DECLARE
    v_ret NUMBER;
    v_text varchar2(10) := 'a';
BEGIN
    insert into a_test (val1, val2) values (1,v_text);
exception
    when others then 
        v_ret := DBMS_SQL.LAST_ERROR_POSITION;
        dbms_output.put_line(dbms_utility.format_error_stack);
        dbms_output.put_line('Error at offset position '||v_ret);
END;
.
/

Note the '43' is the offset from the 'insert' ignoring any preceding whitespace. 注意'43'是'insert'的偏移,忽略任何前面的空格。

You need Oracle DML Error Logging. 您需要Oracle DML错误记录。 Your friend is err$_dest. 你的朋友错了$ _dest。

This can tell you which column failed. 这可以告诉您哪个列失败了。

http://www.oracle-base.com/articles/10g/DmlErrorLogging_10gR2.php#insert http://www.oracle-base.com/articles/10g/DmlErrorLogging_10gR2.php#insert

Unfortunately, you can't get Oracle to tell you which column is causing the problem. 不幸的是,您无法让Oracle告诉您哪个列导致了问题。 Can you dump out your insert data as insert statements that you can run manually through sqlplus? 您可以将插入数据转储为可以通过sqlplus手动运行的插入语句吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM