【问题标题】:ORA-01722: invalid numberORA-01722: 无效号码
【发布时间】:2023-03-15 18:11:01
【问题描述】:

我收到了臭名昭著的无效号码 Oracle 错误。 Hibernate 正在发出一个包含很多列的 INSERT,我只想知道给出问题的列的名称。有可能吗?

仅供参考,插入是这样的:

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 
   (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

【问题讨论】:

  • 您尝试插入的实际数据是什么(例如,绑定变量),表定义是什么(或者至少,哪些字段是数字的?)。没有这些的插入对于调试这种类型的错误毫无用处。

标签: sql oracle ora-01722


【解决方案1】:

试试 DBMS_SQL.LAST_ERROR_POSITION

它会告诉你错误的 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;
.
/

请注意,“43”是“插入”的偏移量,忽略任何前面的空格。

【讨论】:

    【解决方案2】:

    您需要 Oracle DML 错误日志记录。你的朋友是 err$_dest。

    这可以告诉你哪一列失败了。

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

    【讨论】:

      【解决方案3】:

      很遗憾,您无法让 Oracle 告诉您是哪一列导致了问题。您可以将您的插入数据转储为可以通过 sqlplus 手动运行的插入语句吗?

      【讨论】:

        猜你喜欢
        • 2019-08-09
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 2012-09-14
        相关资源
        最近更新 更多