【问题标题】:How to solve numeric or value error? [closed]如何解决数值或数值错误? [关闭]
【发布时间】:2012-10-19 12:02:55
【问题描述】:

在下面的程序中,procedure('newprocedure') 成功创建,因为结果返回 Success 但是这一行 >>>> oresult oot = odb.ExecuteSQL("开始 newprocedur(:ENAME,:ROLLNO); 结束;");它失败并出现此错误>>>> ORA-06502: PL/SQL: numeric or value error: character to number conversion error”。请帮我解决。

我的桌子是这样的

电子表格

卷名 1个凯特 3扎克

`int _tmain(int argc, _TCHAR* argv[])
  {
   OStartup();
   ODatabase odb;
   oresult res = odb.Open("MICROSOFT", "OMNIPOS", "OMNIPOS");
   char pSqlStmt[500];
   memset(pSqlStmt,0,sizeof(pSqlStmt));
   OSqlStmt osql;
   ///////////////////////////////procedure Creation/////////////////
   strcpy(pSqlStmt,"create or replace PROCEDURE newprocedure(inEmpName IN VARCHAR2 ,outEmpno   OUT NUMBER)\n AS \n"); 
  strcat(pSqlStmt,"BEGIN\n"); 
  strcat(pSqlStmt,"select ROLL into outEmpno from Egtable WHERE NAME = inEmpName;\n"); 
 // strcat(pSqlStmt,"dbms_output.put_line('Roll'+outEmpno);\n");
  strcat(pSqlStmt,"outEmpno:=outEmpno+1;\n");
  strcat(pSqlStmt,"update Egtable set ROLL = outEmpno WHERE NAME = inEmpName;\n");
  strcat(pSqlStmt,"END;\n");
  oresult ot = odb.ExecuteSQL(pSqlStmt);

  if (ot == OSUCCESS) 
  {  
   OValue val;
   odb.GetParameters().Add("ENAME","Zac", OPARAMETER_INVAR, OTYPE_VARCHAR2);
   odb.GetParameters().Add("ROLLNO",0, OPARAMETER_OUTVAR, OTYPE_NUMBER); 
   oresult oot = odb.ExecuteSQL("Begin newprocedure(:ENAME,:ROLLNO); End;");
   oresult i = odb.GetParameters().GetParameter("ROLLNO").GetValue(&val);
   cout<< "value is " << (const char*) val<<endl;
  }
  else
  { 
   cout<<"ERR:"<<odb.GetServerErrorText(); 
  } 
  odb.Close();
  OShutdown();
  }

`

提前致谢

【问题讨论】:

  • 如果可能,请出示您的代码。
  • 某个值对于变量来说太大了:检查是否存在太短的 varchars 无法存储您传递或构造的字符串,或者精度不足以存储您正在计算的值的数字。分析您的代码和数据:问题最可能出在哪里?
  • 大家好,我在上面发布了我的代码,请大家告诉我哪里出错了。谢谢
  • 您确实意识到这是一种特殊的做事方式?为什么不直接创建过程一次然后调用它?
  • 谢谢大家,我得到了上面代码的成功结果,问题是我创建的另一个程序正在访问同一个表。所以executesql每次都失败了。

标签: oracle plsql oracle10g oracle11g plsqldeveloper


【解决方案1】:

这是一个简单的语法错误。 Oracle 仅使用“+”进行算术运算。所以在这行代码中...

dbms_output.put_line('Roll'+outEmpno)

...它尝试将outEmpno 添加到'Roll',这是一个字符串。这就是你的程序抛出 ORA-06502 的原因。

解决方法是使用正确的连接运算符,它是双管道:

dbms_output.put_line('Roll '||outEmpno)

还有其他连接字符串的方法,文档中列出了这些方法。 Find out more.

【讨论】:

  • 感谢您的快速回复,对不起,我没有使用该行,我忘了评论该行。
猜你喜欢
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2021-06-14
  • 1970-01-01
  • 2014-03-19
  • 2015-03-23
相关资源
最近更新 更多