2016-10-27 2 views
2

oracle 프로 시저에 배열을 전달하려고합니다. 나는 그것에 대해 검색하고 첫째로 'dizi'라는 형식을 만들었습니다 (여기서는 enter link description here과 같습니다). 그래서 그것은 oracle 개발자에서 작동합니다. 문제는; 매개 변수로 프로 시저에 내 C# 배열을 전달할 수 없습니다. 그러면 내 배열을 내 절차에 어떻게 전달할 수 있습니까?C에서 배열을 Oracle 프로 시저로 전달

public void InsertQuestion(List<string> area_list) 
{ 
    quest_areas = area_list.ToArray(); 
    command.Connection = connect; 
    connect.Open(); 

    var arry = command.Parameters.Add("Areas", OracleDbType.Varchar2); 
    arry.Direction = ParameterDirection.Input; 
    arry.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
    arry.Value = quest_areas; 


    command.CommandText ="TESTPROCEDURE(:Areas)"; 
    command.CommandType = CommandType.StoredProcedure; 
    command.ExecuteNonQuery(); 
    connect.Close(); 
} 
+0

이미 'command.Parameters.Add' 내부적으로'OracleParameter' DbParameter를 추가하고 있습니다. –

+0

하지만 작동하지 않습니까? –

+0

무엇이 오류입니까, ODP.Net 샘플을 확인할 수 있습니까 –

답변

1
  1. 하는 배열 유형과 절차를 정의합니다

    CREATE or replace PACKAGE Testpackage AS 
        TYPE Areas_t is table of VARCHAR(100) index by BINARY_INTEGER; 
        PROCEDURE TESTPROCEDURE(Areas IN Areas_t);  
    END Testpackage; 
    
  2. C 번호 루틴을 : 여기

    내 코드 (안 바인딩 모든 변수 내가 실행하면, 오라클 오류가 말한다)입니다 :

    public void InsertQuestion(IEnumerable<string> area_list) 
    { 
        var connect = new OracleConnection("YOUR CONNECTION STRING"); 
    
        var command = new OracleCommand("BEGIN Testpackage.Testprocedure(:Areas); END;", connect); 
    
        connect.Open(); 
    
        var arry = command.Parameters.Add("Areas", OracleDbType.Varchar2); 
    
        arry.Direction = ParameterDirection.Input; 
        arry.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
        arry.Value = area_list.ToArray(); 
        arry.Size = area_list.Count(); 
        arry.ArrayBindSize = area_list.Select(_ => _.Length).ToArray(); 
        arry.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, area_list.Count()).ToArray(); 
    
        command.ExecuteNonQuery(); 
    
        connect.Close(); 
    } 
    
관련 문제