我被困住了,看不出问题所在。
我创建了一个包含一些逻辑内容的过程并且编译成功,但是当我在表格的触发器中调用它时,它会失败并显示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 ));
答案 0 :(得分:2)
ORA-01722: invalid number
是一个非常简单的错误。这意味着您正在尝试将字符串转换为数字数据类型,但操作失败,因为该字符串包含非数字字符。
所以这意味着你的程序中某处有一个隐式类型转换。您还没有提供表格的说明,因此我们无法告诉您问题发生的位置。你必须自己发现它。
可能是两个地方:
WHERE PLANT_ID = plant_type
不是,则XXLA_PLANTS_TYPE.PLANT_ID
数字VALUES (... '500$');
如果
XXLA_PLANTS_SUPPLIERS.PRICE_IN_KG
不是数字顺便说一句,如果你删除了那个无意义的异常处理程序,你将得到默认的错误堆栈。这会告诉你失败声明的起始行号,这实际上可以消除练习中的大量猜测。