2012-02-29 2 views
5

.net 4.0 C#, IBatisNet 및 CSLA 프레임 워크로 엔터프라이즈 프로젝트가 있습니다."ORA-01084 : OCI 호출에서 잘못된 인수가 있습니다."

패키지에 insert proc를 호출 할 때 프로젝트 작업 중 하나가 ORA-01084: invalid argument in OCI call으로 실패했습니다. 반환 된 오류 메시지는 기껏해야 어리 석다. 저장 프로 시저에는 이름으로 바인딩되지 않은 83 개의 입력 매개 변수가 있습니다 (IBatis 덕분에).

호기심 : 나는 OrderOrderItems라고하는 일련의 기록을 가지고 있습니다. Order에는 28 개의 주문 항목이 있습니다. 작업은 Order을 새로 만들고 OrderItems 개의 레코드를 모두 복사하여 주문을 갱신해야합니다. 새 주문 항목은 이전 주문 항목을 ParentOrderItemId 필드로 참조하며 이는 갱신 예정인 Orders의 선택 기준이기도합니다.

처음 실행하면 OrderItemId: 12345에 프로세스가 실행되고 ORA-01084 오류가 발생합니다. 하지만 다음 번에 다시 실행하면 OrderItemId: 12345을 성공적으로 처리합니다. 그리고 OrderItemId: 12444에 불어납니다. 그런 다음 다시 실행하여 OrderItemId: 12444을 올바르게 처리하는 식으로 진행합니다.

전달 된 DbParameters의 로그가 있는데 두 경우 모두 같습니다.

oci 클라이언트 추적이 있지만 유용하지는 않습니다.

데이터베이스 계층에 로깅을 설정했지만 지금까지는 아무 것도주지 않았습니다.

어떤 아이디어가 이러한 유형의 오류를 추적하는 방법?

+1

막연한 생각 : OCI 호출로 전달 된 매개 변수가 첫 번째 실패 및 두 번째 성공적인 실행에서 동일하면 (DbParameters 로그에서 볼 수 있듯이), 일종의 초기화 오류가있을 수 있으며 null이 포함될 수 있습니다. 값. –

+0

"데이터베이스 계층에 로깅"이라고 말하면 스토어드 프로 시저가 입력 매개 변수를 로깅한다는 의미로 어딘가에서 열 값의 불일치가 발생하지 않았 음을 확인할 수 있습니까? –

+0

예, 나는 모든 곳에서 철저한 로깅을 추가하여 전달되는 내용을 자세히 볼 수 있습니다. – b0rg

답변

1

나는 지난 몇 년 후에 나는 대답을 제공 할 필요가 있다고 생각한다.

문제는 Oracle .Net 드라이버의 문제입니다. 우리는 수량 필드를 INT로 정의했습니다. 내부 아키텍처 때문에 Qty는 음수 또는 null 일 수 있습니다. 케이스의 95 % Qty는 양의 정수 였지만 (조정해야 함) 조정 및 기타 요인으로 인해 널 또는 음수 일 수 있습니다.

수량 1 수량 0 수량 널 수량 -1

올바르게 작동합니다 :

그래서 결국 난 당신이 데이터베이스로 기록을 넣어하는 방법의 순서를 추적.

그러나이 경우

:

수량 널 수량 1 수량 -1

"-1"값에 OCI 잘못된 인수와 함께 날려 버리겠다.

오라클에서 티켓을 생성하여 제품 팀에 보내 수정합니다. 그 이후로 나는 계속 전진 했으므로 확실하지 않은지 그리고 언제 고쳐 졌는지.

+1

그냥 12c ODP.Net을 시도했는데 버그가 아직 거기에있는 것 같습니다. 따라서 우리는 응용 프로그램에서 일관되게 복제 할 수 있으므로 해결하지 못했던 것 같습니다. – dcp

+1

내 프로젝트는 그 당시에는 작았 기 때문에 오라클을 통해 추격하지 않았습니다. 시간과 오라클 지원 계획을 가지고 계시다면 함께 추진할 수 있습니다. 그 중 하나 또는 QTY가 null이 아닌 kludge. – b0rg

+1

시간이 없습니다 :). 어쨌든 새로운 Managed Oracle dll을 사용하면 버그가 발생하지 않습니다 (예 : Oracle.ManagedDataAccess.dll). 따라서 문제는 dll의 관리되지 않는 버전 (예 : Oracle.DataAccess.dll)으로 제한됩니다. 어쨌든, 이것에 대한 귀하의 게시물 주셔서 감사합니다, 그것은 항상 다른 사람이 당신과 같은 문제가 있다는 것을 아는 것이 좋습니다. :). – dcp

0

그게 무슨 가치가 있는지, 방금이 오류가 발생했습니다. 문제가 내 매개 변수 중 하나에 잘못된 OracleType입니다. 유형이 NVarchar으로 설정되었고 데이터베이스 열이 Clob으로 변경되었습니다.

매개 변수 OracleType을 명시 적으로 정의하십시오.

OracleParameter(string name, OracleType oracleType) 
3

나는이 같은 오류 메시지를 받았습니다. 제 경우에는 빈 문자열을 CLOB 열로 전달했기 때문입니다. 일반적으로 큰 XML 문서를 전달하지만 때로는 문서가 없습니다. 이제 빈 문자열을 확인하고 "empty"라고 씁니다.

-1

데이터 형식이 nchar(2) 인 Nullable 열이 문제였습니다. null을 허용하지 않지만 데이터를 삽입하는 동안 일부 값을 전달해야합니다.

+0

예제를 제공했다면 이것은 아마도 훨씬 더 나은 대답이었을 것입니다. – Nae

관련 문제