2009-06-06 5 views
11

C# 오라클 저장 프로 시저 매개 변수 순서

PROCEDURE "ADD_BOOKMARK_GROUP" (
    "NAME" IN VARCHAR2, 
    "BOOKMARK_GROUP_ID" IN NUMBER, 
    "STAFF_ID" IN VARCHAR2, 
    "MAX_NO" IN INT, 
    "NUMFOUND" OUT INT, 
    "NEW_ID" OUT NUMBER) IS 

BEGIN 

NEW_ID := -1; 

SELECT COUNT(*) INTO NUMFOUND FROM BOOKMARK_GROUP_TABLE WHERE STAFF_ID = STAFF_ID; 

IF NUMFOUND < MAX_NO THEN 
    INSERT INTO BOOKMARK_GROUP_TABLE (NAME, BOOKMARK_GROUP_ID, STAFF_ID) VALUES(NAME, BOOKMARK_GROUP_ID, STAFF_ID); 
    SELECT BGT_SEQUENCE.currval INTO NEW_ID FROM dual; 
END IF; 
END; 

에서는 파라미터가 정의 된 순서대로 매개 변수를 추가하지 않으면 흥미 롭습니다.

대신

OracleCommand cmd = new OracleCommand("ADD_BOOKMARK_GROUP", conn); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add(new OracleParameter("NAME", name)); 
... 
cmd.Parameters.Add(new OracleParameter("NUMFOUND", OracleDbType.Int32)).Direction = ParameterDirection.Output; 
cmd.Parameters.Add(new OracleParameter("NEW_ID", OracleDbType.Decimal)).Direction = ParameterDirection.Output; 
cmd.Parameters["NEW_ID"].Value.ToString() 
cmd.Parameters["NEW_ID"].Value.ToString() 

cmd.Parameters["NUMFOUND"].Value.ToString() 

VS2008 서버 탐색기를 통해 프로 시저를 실행하면 올바른 데이터가 반환되지만 스왑됩니다. .

이유가 무엇입니까?

답변

10

나는 오라클 버프가 아니기 때문에 확인할 수는 없습니다.하지만 은 (이름 대신 전달되는 것이 아니라) 위치로 전달되는 것처럼이라고 들립니다. 도덕적 equivelent에 :

EXEC SomeProc 'Foo', 'Bar' 

대신 :

EXEC SomeProc @arg1='Foo', @arg2='Bar' 

이것은 대단히 드문 일이 아니다 - (는 COM 일) 년 내 코드의 많은 패스 별과 함께 일해야했다 -position ADODB 드라이버.

이 경우 주어진 이름은 에만 해당 컬렉션 컬렉션에서 값을 조회하는 데 사용됩니다. 당신은 이름을 발명하여 쉽게 확인할 수 있습니다

cmd.Parameters.Add(new OracleParameter("BANANA", ... 
cmd.Parameters.Add(new OracleParameter("GUITAR", ... 
... 
cmd.Parameters["BANANA"].Value.ToString() 
cmd.Parameters["GUITAR"].Value.ToString() 

을 오류없이 위의 실행, 그것은 위치에 의해 전달됩니다. 그리고 그것 그들은 위치에 의해 전달됩니다 ... 그럼 그냥 그들을 올바른 순서로 추가 ;-p 그리고 끝 부분을 제외하고 새로운 매개 변수를 추가하지 마십시오 ...

+0

그래서 패스 이름은 많이 될 것입니다. 더 유용한. –

24

보기 당신은 아마도 OracleCommand를 개체의 BindByName 매개 변수를 설정할 수 있습니다. 이 매개 변수를 사용하여 직접 SQL 쿼리에 대해 작동하지만 저장 프로 시저로 시도하지 않았지만 논리적 일 것입니다. ...

cmd.BindByName = true; 
+5

이것은 실제 답변입니다. 수락해야합니다. –

+0

나는 @ 존 글리젠 (JohnGietzen)에 동의한다. 이것은 받아 들여진 대답이어야한다. – Ergec

+0

이것은 더 이상 대머리가되지 않도록 나를 구했다. 기본적으로이 작업을 수행하는 SQL Server 배경에서 나는 매개 변수가있는 인라인 쿼리가 작동하지 않는 이유를 알아 내려고 노력했습니다. 감사! – Caverman

관련 문제