2010-03-25 2 views
0

나는 SQL Server에 익숙해 져 오랜 시간 동안이 문제로 어려움을 겪고 있습니다. 다음 코드를 가지고 OracleDbType이 정확하고 매개 변수에 전달되는 실제 값이 일치하는지 확인했습니다. 내 문제는 반환 값으로 인해 해결할 수 있다고 생각합니다. 그게 행 수를 줄뿐입니다. 반환 매개 변수가 맨 위에 설정되어야한다는 어딘가를 읽었습니다. 라인 1, 열 7 :
ORA-06550 u0027 (으) \ u0027INSERT_REC \에 잘못된 번호 또는 전화에 인수 유형 : \ 고정 이하 여신/SQL : 문 무시 내가 무엇입니까 특정 오류ASP.NET 및 Oracle Data Provider를 사용하여 Oracle Stored Proc를 처리하는 방법은 무엇입니까?

가 는

PLS-00306 말한다

저장된 절차는 다음과 같이

PROCEDURE INSERT_REC 
(
    A_MILL_CENTER  IN GRO_OWNER.MOVEMENT.MILL_CENTER%TYPE,  --# VARCHAR2(10) 
    A_INGREDIENT_CODE IN GRO_OWNER.MOVEMENT.INGREDIENT_CODE%TYPE, --# VARCHAR2(50) 
    A_FEED_CODE  IN GRO_OWNER.MOVEMENT.FEED_CODE%TYPE,  --# VARCHAR2(30) 
    --# A_MOVEMENT_TYPE should be ‘RECEIPT’ for ingredient receipts 
    A_MOVEMENT_TYPE IN GRO_OWNER.MOVEMENT.MOVEMENT_TYPE%TYPE, --# VARCHAR2(10) 
    A_MOVEMENT_DATE IN VARCHAR2,        --# VARCHAR2(10) 
    A_MOVEMENT_QTY IN GRO_OWNER.MOVEMENT.MOVEMENT_QTY%TYPE, --# NUMBER(12,4) 
    --# A_INVENTORY_TYPE should be ‘INGREDIENT’ or ‘FINISHED’ 
    A_INVENTORY_TYPE IN GRO_OWNER.MOVEMENT.INVENTORY_TYPE%TYPE, --# VARCHAR2(10) 
    A_CREATE_USERID IN GRO_OWNER.MOVEMENT.CREATE_USERID%TYPE, --# VARCHAR2(20) 
    A_RETURN_VALUE OUT NUMBER         --# NUMBER(10,0) 
); 

내 코드는 다음과 같습니다

for (int i=0; i < theData.Length -1; i+=3) 
       { 
//3 items hardcoded for now 

string millCenter = "0010260510"; 
string movementType = "RECEIPT"; 
string feedCode = "test this"; 
string userID = "GRIMMETTM"; 
string inventoryType = "INGREDIENT"; //set to FINISHED for feed stuff 
string movementDate = theData[i]; 
string ingCode = System.Text.RegularExpressions.Regex.Match(
     theData[i + 1], @"^([0-9]*)").ToString(); 
//int pounds = Convert.ToInt32(theData[i + 2].Replace(",", "")); 
int pounds = 100; 

//setup parameters 

OracleParameter p9 = 
    new OracleParameter("A_RETURN_VALUE", OracleDbType.Int32, 30); 
p9.Direction = ParameterDirection.ReturnValue; 
oraCmd.Parameters.Add(p9); 

OracleParameter p1 = 
    new OracleParameter("A_MILL_CENTER", OracleDbType.Varchar2, 10); 
p1.Direction = ParameterDirection.Input; 
p1.Value = millCenter; 
oraCmd.Parameters.Add(p1); 

OracleParameter p2 = 
    new OracleParameter("A_INGREDIENT_CODE", OracleDbType.Varchar2, 50); 
p2.Direction = ParameterDirection.Input; 
p2.Value = ingCode; 
oraCmd.Parameters.Add(p2); 

OracleParameter p3 = 
    new OracleParameter("A_FEED_CODE", OracleDbType.Varchar2, 30); 
p3.Direction = ParameterDirection.Input; 
p3.Value = feedCode; 
oraCmd.Parameters.Add(p3); 

OracleParameter p4 = 
    new OracleParameter("A_MOVEMENT_TYPE", OracleDbType.Varchar2, 10); 
p4.Direction = ParameterDirection.Input; 
p4.Value = movementType; 
oraCmd.Parameters.Add(p4); 

OracleParameter p5 = 
    new OracleParameter("A_MOVEMENT_DATE", OracleDbType.Varchar2, 10); 
p5.Direction = ParameterDirection.Input; 
p5.Value = movementDate; 
oraCmd.Parameters.Add(p5); 

OracleParameter p6 = 
    new OracleParameter("A_MOVEMENT_QTY", OracleDbType.Int32, 12); 
p6.Direction = ParameterDirection.Input; 
p6.Value = pounds; 
oraCmd.Parameters.Add(p6); 

OracleParameter p7 = 
    new OracleParameter("A_INVENTORY_TYPE", OracleDbType.Varchar2, 10); 
p7.Direction = ParameterDirection.Input; 
p7.Value = inventoryType; 
oraCmd.Parameters.Add(p7); 

OracleParameter p8 = 
    new OracleParameter("A_CREATE_USERID", OracleDbType.Varchar2, 20); 
p8.Direction = ParameterDirection.Input; 
p8.Value = userID; 
oraCmd.Parameters.Add(p8); 


//open and execute 
oraConn.Open(); 
oraCmd.ExecuteNonQuery(); 
oraConn.Close(); 
+0

@Matt : 코드를 다시 포맷하여 가로 스크롤 막대가 생기지 않도록하고 PL/SQL 모양을 유효하게 만들었습니다. 제 변경 사항에 동의하는지 확인하십시오. –

+0

중요한 정보가 빠졌습니다 : 저장된 proc에 대한 호출은 for 루프에 있습니다. 첫 번째 실행이 완료되고 두 번째 실행이 실패합니다. 루프를 반영하도록 위의 코드를 업데이트합니다. – Matt

답변

0

ParameterDirection는 ParameterDirection.Output을해야

+0

은 여전히 ​​같은 오류 메시지가 표시됩니다. – Matt

+1

"brute force"를 사용하십시오. params없이 저장된 proc을 생성하고 테스트 한 다음 실패 할 때까지 하나씩 추가하기 시작하십시오. – user38123

+0

위의 수정 사항을 참조하십시오. – Matt

0

첫 번째 대신에 RETURN_VALUE 매개 변수를 마지막으로 추가 했습니까? 필자가 기억한다면 Oracle 공급자를 통해 Oracle 저장 프로 시저를 호출 할 때 매개 변수가 정확히 동일한 순서 여야합니다. A_RETURN_VALUE에 대한

+0

예 다른 의견을 제안하는 것처럼 ParameterDirection을 Output으로 변경하는 것뿐만 아니라이를 시도했습니다. – Matt

+0

위의 편집 내용을 참조하십시오. – Matt

0

이 샘플에서 말할 수 없다,하지만 당신은 루프의 범위를 외부 oraCmd 객체를 선언하는 것이 될 수 있을까? 예제에서 선언문을 볼 수는 없지만,이 경우 각 반복은 모든 Oracle 매개 변수를 배열에 추가하므로 첫 번째 이후에는 모든 실행에 너무 많은 변수가 있습니다.

관련 문제