2012-10-30 2 views
-1

아래 프로그램에서 프로 시저 ('newprocedure')가 성공적으로 생성되었습니다. 반환 값 성공하지만이 줄은 >>>> oresult oot = odb.ExecuteSQL ("begin newprocedur (: ENAME, : ROLLNO); ; 그 실패 점점이 오류 >>>> ORA-06502 받고 : PL/SQL : 숫자 또는 값 오류 :. 솔루션을 도와 호야 "숫자 변환 오류로 문자를숫자 또는 값 오류를 해결하는 방법은 무엇입니까?

그리고 내 표는이

처럼 보인다 A의

Egtable

롤 이름 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(); 
    } 

`

감사합니다 dvance

+0

절차를 보여주십시오. (질문) – hims056

+0

가능하면 코드를 보여주십시오. – OQJF

+0

일부 값이 변수에 비해 너무 큽니다. 지나치는 varchars가 지나가는 문자열을 저장하는지 확인하거나 계산할 값을 저장할 정밀도가 충분하지 않은 숫자를 확인하십시오. 코드 및 데이터 분석 : 문제가 될 가능성이 가장 큰 부분은 어디입니까? –

답변

1

간단한 구문 오류입니다. 오라클은 '+'연산만을 사용합니다. 그래서 코드 줄 ...

dbms_output.put_line('Roll'+outEmpno) 

에 ... 그것은 문자열 '롤'에 outEmpno를 추가하려고 시도합니다. 이것이 귀하의 프로그램이 ORA-06502를 강타한 이유입니다.

이 솔루션은 이중 파이프입니다 올바른 연결 연산자를 사용하는 것입니다

문서에 나와있는 문자열을 결합하는 다른 방법이있다
dbms_output.put_line('Roll '||outEmpno) 

. Find out more.

+0

ur 빠른 응답을 위해 고맙다, 미안 나는 그 선을 사용하지 않는 실수했다, 나는 선을 주석을다는 것을 잊는다. – 1001