首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-01722:无效数字错误-1

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

Stack Overflow用户
提问于 2018-02-23 16:10:35
回答 1查看 1.6K关注 0票数 0

我被困住了,看不出是什么问题。

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

任何帮助都将受到感激。

以下是程序:

代码语言:javascript
复制
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;

这是触发因素:

代码语言:javascript
复制
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,但是当我运行它时它会出错。

代码语言:javascript
复制
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 ));
EN

回答 1

Stack Overflow用户

发布于 2018-02-24 09:52:27

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

因此,这意味着在您的过程的某个地方,您有一个隐式类型转换。您还没有提供表的描述,因此我们无法告诉您问题发生在哪里。你得自己去发现。

有两个地方可能是:

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

顺便说一句,如果您删除了那个毫无意义的异常处理程序,您将得到默认的错误堆栈。这将告诉您失败语句的起始行号,这将真正消除练习中的许多猜测。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48951972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档