我被困住了,看不出是什么问题。
我用一些逻辑内容创建了一个过程,并成功地编译了它,但是当我在我的表上的触发器中调用它时,它在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,但是当我运行它时它会出错。
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 ));发布于 2018-02-24 09:52:27
ORA-01722: invalid number是一个非常简单的错误。这意味着您试图将字符串转换为数字数据类型,但操作失败,因为该字符串包含非数字字符。
因此,这意味着在您的过程的某个地方,您有一个隐式类型转换。您还没有提供表的描述,因此我们无法告诉您问题发生在哪里。你得自己去发现。
有两个地方可能是:
WHERE PLANT_ID = plant_type不是数值,则为XXLA_PLANTS_TYPE.PLANT_IDVALUES (... '500$');不是数值,则为XXLA_PLANTS_SUPPLIERS.PRICE_IN_KG顺便说一句,如果您删除了那个毫无意义的异常处理程序,您将得到默认的错误堆栈。这将告诉您失败语句的起始行号,这将真正消除练习中的许多猜测。
https://stackoverflow.com/questions/48951972
复制相似问题