我已经编写了一个存储过程,其中我只提供输入参数将记录插入到四个表中但我无法找到为什么它抛出以下错误,尽管我传递了正确的数字。任何建议
另外,购买表是从employees表引用EID的外键,购买表是从products表引用PID的外键 ans purchase表是从customers表引用CID的外键, 并且在我将参数传递给存储过程之后,插入时我想通过键盘输入...
存储过程如下:
PROCEDURE add_purchase(e_id IN char,p_id IN char,
c_id IN char,pur_qty IN NUMBER) AS
Total_Price NUMBER(7,2);
ENAME VARCHAR2(15 BYTE);
TELEPHONE# CHAR(12 BYTE);
CNAME VARCHAR2(15 BYTE);
VISITS_MADE NUMBER(4,0);
PNAME VARCHAR2(15 BYTE);
QOH NUMBER(5,0);
QOH_THRESHOLD NUMBER(4,0);
ORIGINAL_PRICE NUMBER(6,2);
DISCNT_RATE NUMBER(3,2);
BEGIN
INSERT INTO employees (EID,ENAME,TELEPHONE#)
values (e_id,'&ENAME','&TELEPHONE');
INSERT INTO CUSTOMERS (CID,CNAME,TELEPHONE#,VISITS_MADE,LAST_VISIT_DATE)
VALUES (c_id,'&CNAME','&TELEPHONE','&VISITS_MADE',SYSDATE);
INSERT INTO PRODUCTS(PID,PNAME,QOH,QOH_THRESHOLD,ORIGINAL_PRICE,DISCNT_RATE)
VALUES (p_id,'&PNAME','&QOH','&QOH_THRESHOLD','&ORIGINAL_PRICE','&DISCNT_RATE');
select (pro.ORIGINAL_PRICE * (1 - pro.DISCNT_RATE)) into Total_Price
from purchases pur,products pro where pro.pid=pur.pid;
INSERT INTO purchases(EID,PID,CID,QTY,PTIME,Total_Price)VALUES
(e_id,p_id,c_id,pur_qty,sysdate,Total_Price);
EXCEPTION
WHEN OTHERS THEN
raise;
END add_purchase;
执行:
EXEC add_purchase ('e11','p011','c011',100);
错误:
ORA-01722: invalid number
ORA-06512: at line 1
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
答案 0 :(得分:0)
尝试将字符串转换为数字时出现ORA-01722(“无效数字”)错误,且字符串不能
使用键盘输入原始价格,折扣率,访问值可能会在输入实际上不是数字时导致此错误。
但存储过程是否允许键盘输入?上次我检查时没有。
所以这个插入显然传递了一个文字字符串'& ORIGINAL_PRICE',其中需要一个NUMBER。
INSERT INTO PRODUCTS(PID,PNAME,QOH,QOH_THRESHOLD,ORIGINAL_PRICE,DISCNT_RATE)
VALUES (p_id,'&PNAME','&QOH','&QOH_THRESHOLD','&ORIGINAL_PRICE','&DISCNT_RATE');
在尝试转换为NUMBER时,似乎“& ORIGINAL_PRICE”之类的字符串应该始终产生此类错误,
因此,不是在sp的insert values子句中引用像'& ORIGINAL_PRICE'这样的替换,而是为每个替换执行类似的操作......
accept o_price number format '99999.99' prompt 'Original Price:'
在调用sp的脚本中,然后将sp传递& o_price作为参数调用。
sp中的insert values子句看起来像
INSERT INTO PRODUCTS(PID,PNAME,QOH,QOH_THRESHOLD,ORIGINAL_PRICE,DISCNT_RATE)
VALUES (p_id,PNAME,QOH,QOH_THRESHOLD,ORIGINAL_PRICE,DISCNT_RATE);
没有更多& sp代码中的替换。
ORIGINAL_PRICE和其他输入参数已使用正确的类型声明。因此,如果输入错误输入,则可能只会出现转换错误。
如果ORIGINAL_PRICE等列实际上被定义为表中的字符,那么问题可能出现在表达式(1 - pro.DISCNT_RATE)
中。
所以我认为有人可以给你一个更好的答案,但我发布的可能是有用的。