Sql server 将输入参数传递到oracle中的存储过程时出错
我已经编写了一个存储过程,在这个过程中,我只提供输入参数,以便在四个表中插入记录,但我无法找到为什么会出现下面的错误,尽管我传递了正确的数字。有什么建议吗 另外,采购表引用员工表中EID的外键,采购表引用产品表中PID的外键 ans采购表正在引用customers表中CID的外键, 在我将参数传递给存储过程之后,在插入过程中,我想通过键盘进行输入 存储过程如下所示:Sql server 将输入参数传递到oracle中的存储过程时出错,sql-server,database,oracle,oracle11g,oracle10g,Sql Server,Database,Oracle,Oracle11g,Oracle10g,我已经编写了一个存储过程,在这个过程中,我只提供输入参数,以便在四个表中插入记录,但我无法找到为什么会出现下面的错误,尽管我传递了正确的数字。有什么建议吗 另外,采购表引用员工表中EID的外键,采购表引用产品表中PID的外键 ans采购表正在引用customers表中CID的外键, 在我将参数传递给存储过程之后,在插入过程中,我想通过键盘进行输入 存储过程如下所示: PROCEDURE add_purchase(e_id IN char,p_id IN char, c_id IN char,
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.
当试图将字符串转换为数字时,会发生ORA-01722(“无效数字”)错误,并且无法删除该字符串
使用键盘输入原始价格、折扣率、访问次数值时,如果输入的不是实际数字,则可能会导致此错误
但存储过程甚至允许键盘输入吗?上次我检查时,它们不允许
所以这个insert显然传递了一个文本字符串“&ORIGINAL_PRICE”,其中应该有一个数字
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的insert values子句中引用诸如“&ORIGINAL_PRICE”之类的替换,对于每个替换,您将执行如下操作
accept o_price number format '99999.99' prompt 'Original Price:'
在调用sp的脚本中,然后调用sp passing&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的代码中将不再有替换
原始价格和其他输入参数已使用正确的类型声明。因此,只有在输入错误的输入时,才可能出现转换错误
如果原始价格等列实际上在表中定义为字符,那么问题可能出现在表达式(1-pro.DISCNT\u RATE)
中
因此,我认为有人可以给你一个更好的答案,但我认为我的答案可能有用。第一个insert的values子句中的e_id是否应该是一个数字?我不记得在sql中有任何从char到int或到number的自动升级。我已经很久没有使用它了,但是oracle在文档中对每个ora-########数字的含义非常清楚。@joshp:e#id、p#id、c#id都是字符类型您认为“&ORIGINAL#u PRICE”在存储过程中会起作用吗?我认为它是一个SQLPlus替换变量,在存储过程中不起作用,而只在带有accept语句的批处理中起作用。我身边没有甲骨文来尝试它,(tutorialspoint?),但是“&ORIGINAL_PRICE”真的是一个有效的数字(6,2)吗?我可不这么看。我要尝试的第一件事是将这些替换从sp中取出,并将它们放在您运行以调用sp的脚本中。但可能我没有抓住要点。这对我来说已经20岁了。