【发布时间】: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