Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将输入参数传递到oracle中的存储过程时出错_Sql Server_Database_Oracle_Oracle11g_Oracle10g - Fatal编程技术网

Sql server 将输入参数传递到oracle中的存储过程时出错

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,

我已经编写了一个存储过程,在这个过程中,我只提供输入参数,以便在四个表中插入记录,但我无法找到为什么会出现下面的错误,尽管我传递了正确的数字。有什么建议吗

另外,采购表引用员工表中EID的外键,采购表引用产品表中PID的外键 ans采购表正在引用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.   
当试图将字符串转换为数字时,会发生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岁了。