ORA-01722 运行存储过程时出错

Posted

技术标签:

【中文标题】ORA-01722 运行存储过程时出错【英文标题】:ORA-01722 Error when running stored procedure 【发布时间】:2015-04-20 23:20:55 【问题描述】:

我正在尝试运行一个存储过程,但是当我使用一个有效的数字运行它时,它会给我一个 ORA-01722 错误。我检查以确保 where 子句中使用参数的列是 NUMBER 类型。我检查以确保记录存在。注意:当我取出 c.charges-c.payment 时,查询运行良好。

create procedure patient_InfoNew(vpatientID NUMBER) IS
  x VARCHAR2(300);
BEGIN
  select a.firstname ||
         a.lastname || ' ' ||
         a.ssn || ' ' ||
         a.streetname || ' ' ||
         a.phonenumber || ' ' ||
         b.servicedate || ' ' ||
         b.servicetype || ' ' ||
         c.charges - c.payment || ' ' ||
         e.name || ' ' ||
         e.insnumber into x
    from patient a,
         patientaccount b,
         patient_info c,
         patientinsurance d,
         insurance e
    where a.id = vpatientID AND
          e.id = d.insuranceid AND
          a.id = b.id AND
          a.id = c.id AND
          a.id = d.id AND
          b.servicedate = (Select MAX(servicedate)
                             from patientaccount
                             where id = vpatientID);

  DBMS_OUTPUT.PUT_LINE(x);
EXCEPTION
  WHEN VALUE_ERROR THEN                 
    DBMS_OUTPUT.PUT_LINE('Error ' || SQLCODE || SUBSTR(SQLERRM,1,80));  
  WHEN ZERO_DIVIDE THEN
     DBMS_OUTPUT.PUT_LINE('Divide by zero');
  WHEN OTHERS THEN
    IF SQL%NOTFOUND THEN
      DBMS_OUTPUT.PUT_LINE('No such record was found');
    END IF;

    DBMS_OUTPUT.PUT_LINE('Error ' || SQLCODE || SUBSTR(SQLERRM,1,80));
END;

这是我在下面得到的错误:

No such record was found 
Error -1722ORA-01722: invalid number 
PL/SQL procedure successfully completed.

【问题讨论】:

那么,c.charges 和 c.payment 的值是多少?它们在表中的数据类型是什么? @OldProgrammer 对于我正在测试的情况,它们的值都是 250,并且都是 NUMBER 类型。 请编辑您的问题并包含此查询中涉及的所有表的定义。 PATIENT_INFO.ID 中的值也很有趣。谢谢。 【参考方案1】:

把你的减法用括号括起来:(c.charges - c.payment)

如果你不这样做,你实际上是在尝试减去字符串(减号左侧的所有内容都连接在一起,减去右侧的所有内容都连接在一起)。

双方均未计算出有效数字。

更多关于操作顺序的信息在这里:http://docs.oracle.com/cd/B14117_01/appdev.101/b10807/02_funds.htm

请注意,减法和连接处于同一级别,因此您需要括号来阐明表达式的含义。

【讨论】:

以上是关于ORA-01722 运行存储过程时出错的主要内容,如果未能解决你的问题,请参考以下文章

调用 Java 过程时 Oracle ORA-01722

运行存储过程时出错

在mysql中运行存储过程时出错

运行存储过程时出错 ERROR 1064 (42000)

执行使用 PyMSSQL 引用链接服务器的存储过程时出错

如何在数字字段的条件下将逗号分隔的数字字符串传递给存储过程?