ORA-01722:无效数字错误 - 1

时间:2018-02-23 16:10:35

标签: oracle plsql database-trigger

我被困住了,看不出问题所在。

我创建了一个包含一些逻辑内容的过程并且编译成功,但是当我在表格的触发器中调用它时,它会失败并显示ORA-01722: invalid number

感谢任何帮助。

以下是程序:

create or replace Procedure Check_Plants_Fields(  
    field_id                 IN               number ,
    farmer_name              IN               varchar2,
    planting_date            IN               date DEFAULT sysdate,
    planting_amount          IN               number,
    plant_type               IN               number)    
IS
   l_plant_type XXLA_PLANTS_TYPE.PLANT_TYPE%type;
   l_number_of_months  XXLA_PLANTS_SUPPLIERS.NUMBER_MONTHS_TO_CUT%type;    
   cursor c1 is
       SELECT PLANT_TYPE , AMOUNT_
       FROM XXLA_PLANTS_TYPE
       WHERE PLANT_ID = plant_type;  
   cursor c2 is
       SELECT to_number(MOD(Round(DBMS_RANDOM.Value(1, 8)), 9) + 1)
       FROM DUAL;
BEGIN
   open c1;
   open c2;
   fetch c2 into l_number_of_months;
   if c1 %notfound then
       close c1;
       dbms_output.put_line('You dont have this type, please supply it to your store . ' || '     ' || 'thanx.'); 
   end if;
   for i in (SELECT PLANT_TYPE , AMOUNT_
            FROM XXLA_PLANTS_TYPE
            WHERE PLANT_ID = plant_type) 
   LOOP
       if i.AMOUNT_ < 20 then
           dbms_output.put_line(i.AMOUNT_ ||' AMOUNT_: '|| i.AMOUNT_);
           UPDATE XXLA_PLANTS_SUPPLIERS
           SET supplier_id = supplier_id_seq.nextval;
           INSERT INTO XXLA_PLANTS_SUPPLIERS
               (supplier_id, supplier_name, number_months_to_cut, date_,amount, price_in_KG)
           VALUES (supplier_id_seq.nextval, 'Benefits etc',l_number_of_months ,sysdate+1, 80 + i.AMOUNT_,'500$');     
        end if;
   END LOOP i;
   commit;
   close c2;
EXCEPTION
    WHEN OTHERS THEN
       raise_application_error(-20001,'An error was encountered,- '||SQLCODE||' -ERROR- -->'||SQLERRM );
END;

这是触发器:

create or replace TRIGGER xxbefor_insert_plants
BEFORE INSERT ON  XXLA_PLANT_FIELDS
FOR EACH ROW
BEGIN
    Check_Plants_Fields(:NEW.field_id, :NEW.farmer_name, :NEW.planting_date, :NEW.planting_amount, :NEW.plant_type);
END;

这是执行调用过程的触发器的插入,但是当我运行它时它会出错。

INSERT INTO XXLA_PLANT_FIELDS
(field_id, FARMER_NAME,planting_date,planting_amount,plant_type )
VALUES
(4, 'Test1',sysdate,8,1 (because this parameter it should work its under 20 ));

1 个答案:

答案 0 :(得分:2)

ORA-01722: invalid number是一个非常简单的错误。这意味着您正在尝试将字符串转换为数字数据类型,但操作失败,因为该字符串包含非数字字符。

所以这意味着你的程序中某处有一个隐式类型转换。您还没有提供表格的说明,因此我们无法告诉您问题发生的位置。你必须自己发现它。

可能是两个地方:

    如果WHERE PLANT_ID = plant_type不是,则
  • XXLA_PLANTS_TYPE.PLANT_ID 数字
  • VALUES (... '500$');如果 XXLA_PLANTS_SUPPLIERS.PRICE_IN_KG不是数字

顺便说一句,如果你删除了那个无意义的异常处理程序,你将得到默认的错误堆栈。这会告诉你失败声明的起始行号,这实际上可以消除练习中的大量猜测。