2015-11-25 60 views
0

我写了一个存储过程,其中我只给出输入参数以将记录插入到四个表中,但我无法找到为什么抛出错误,尽管我传递的是正确的数.ANY建议将输入参数传递给存储过程在oracle中时出错

也,购表人是从员工表和购买表引用EID的外键引用从产品表PID的外键 ANS采购表是从客户表中引用CID的外键, 后我将参数传递给存储过程,而插入我想通过键盘输入...

s tored过程如下:

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

是否可能是第一个插入的值子句中的e_id预期为数字?我不记得任何从char到int的自动升级或sql中的数字。自从我使用它以来一直很年轻,但是oracle在文档中对每个ora - ####数字的含义都非常清楚。 – joshp

+0

@joshp:e_id,p_id,c_id都是字符类型 – John

+0

您认为'&ORIGINAL_PRICE'将在存储过程中起作用吗?我将它看作SQLPlus替换变量,它在存储过程中不起作用,但仅在具有接受语句的批处理中起作用。我没有甲骨文试用它(教程点?),但是'&ORIGINAL_PRICE'真的是一个有效的NUMBER(6,2)?不看这种方式给我。我会尝试的第一件事就是从sp中取出这些替换,并将它们放入您运行的脚本中调用sp。但也许我错过了这一点。这对我来说大约20岁。 – joshp

回答

0

一种ORA-01722( “无效号码”)时试图转换一个发生错误字符串转换为数字,且字符串不能为

用键盘输入原价,折扣ra如果输入实际上不是数字,访问值可能会导致此错误。

但存储过程甚至允许键盘输入?我上次检查他们没有。

所以这个插入显然是传递一个字符串'& 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'); 

看来,像“& ORIGINAL_PRICE”字符串应该尝试转换为数字时,总会产生这种错误,

因此,而不是指换人像SP的插入值“& ORIGINAL_PRICE”子句,每个取代你会做这样的事情......

accept o_price number format '99999.99' prompt 'Original Price:' 

在调用该SP的脚本,然后调用SP通过& o_price作为PARAMET呃。

中SP的插入值条款看起来像

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)中。

所以我认为有人可以给你一个更好的答案,但我发布我的可能有用。

相关问题