.NET 애플리케이션에서 스토어드 프로시저 호출

.NET 애플리케이션은 DB2Command 오브젝트를 사용하여 스토어드 프로시저를 호출할 수 있습니다.

프로시저

  1. 대상 데이터베이스에 대한 연결을 작성하십시오. 데이터베이스 연결을 설정하는 단계는 IBM Data Server Provider for .NET을 사용하여 애플리케이션에서 데이터베이스에 연결의 내용을 참조하십시오.
  2. DB2Command 오브젝트를 작성하고 CommandType 특성을 CommandType.StoredProcedure 또는 CommandType.Text로 설정하십시오. CommandType 특성의 기본값은 CommandType.Text입니다. CommandType.Text 값을 사용하여 스토어드 프로시저를 호출할 수 있습니다. 하지만 CommandType 특성을 CommandType.StoredProcedure로 설정하면 더 쉽게 스토어드 프로시저를 호출할 수 있습니다. CommandType.StoredProcedure 오브젝트를 사용하여 스토어드 프로시저를 호출하는 경우에는 스토어드 프로시저와 연관된 스토어드 프로시저 이름 및 매개변수를 지정해야 합니다. 서로 다른 스키마에 동일한 이름 및 매개변수를 가진 스토어드 프로시저가 존재할 수 있습니다. 올바르지 않은 스토어드 프로시저의 호출을 방지하려면 올바른 스키마 이름으로 스토어드 프로시저 이름을 완전히 규정하십시오.
    CommandType.Text 오브젝트의 C# 코드 예는 다음과 같습니다.
    DB2Command cmd = conn.CreateCommand();
    String procCall = "CALL TEST_PROC (@input_param1)";
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = procCall;
    
    주: CommandType 특성이 CommandType.Text이면 CALLEXECUTE PROCEDURE 문이 모두 지원됩니다.
    CommandType.StoredProcedure 오브젝트의 C# 코드 예는 다음과 같습니다.
    DB2Command cmd = conn.CreateCommand();
    String procName = "TEST_PROC";
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = procName;
    
    주: CommandType 특성이 CommandType.StoredProcedure인 경우 이름 지정된 매개변수는 지원되지 않습니다.
  3. IN, INOUT및 OUT 매개변수에 해당하는 DB2Command.Parameters 오브젝트를 작성하십시오. 스토어드 프로시저 매개변수에 매개변수 표시문자를 사용하는 경우 DB2Parameter 오브젝트를 작성하고 Add 메소드를 사용하여 DB2Parameter 오브젝트를 DB2Command.Parameters 오브젝트에 바인드하십시오.
    C# 코드 예는 다음과 같습니다.
    DB2Parameter p1 = new DB2Parameter(“input_param1”, DB2Type.Integer);
    p1.Value = 123;
    db2Command.Parameters.Add(p1);
    스토어드 프로시저 매개변수를 호스트 변수, 이름 지정된 매개변수 또는 위치 지정된 매개변수와 함께 전달할 수 있습니다. 하지만 서로 다른 메소드를 사용하여 동일한 SQL문의 스토어드 프로시저 매개변수를 전달할 수는 없습니다. 다음 C# 코드 예와 같이 매개변수 이름에 의해 규정된 경우에는 순서에 관계없이 매개변수를 스토어드 프로시저에 전달할 수 있습니다.
    CREATE PROCEDURE schema.my_proc ( IN var1 int, INOUT var2 int )
    	LANGUAGE SQL
    	BEGIN
    		-- procedure code here
    	END
    
    String procCall = "CALL my_proc (var2=>@param2, var1=>@param1");
    IBM 은 다음 데이터베이스 서버에서 ARRAY 데이터 유형을 입력 (IN) 매개변수로 사용하여 스토어드 프로시저 호출을 지원합니다.
    • Db2®.
    • 새 기능 모드 (NFM) 의 Db2 for z/OS® 버전 11 서버
    • IBM i 의 경우 Db2 V7R1 이상의 서버.
    ARRAY 데이터 유형은 OUT 및 INOUT 매개변수에는 지원되지 않습니다. ARRAY 길이 값은 각 ARRAY 매개변수에 대해 DB2Parameter.ArrayLength 오브젝트에서 지정되어야 합니다. C# 코드 예는 다음과 같습니다.
    Int32 integerArray = new Int32[] { 12, 34, 45, 67 };
    DB2Parameter p1 = new DB2Parameter(“input_param1”, Type.Integer);
    p1.Value = integerArray;
    p1.ArrayLength = 3;
    db2Command.Parameters.Add(p1);
    Cursor 열거 멤버는 유형 커서의 INOUT(InputOutput) 또는 OUT(Output) 매개변수를 바인드할 때 사용할 수 있습니다. 출력 매개변수의 C# 코드 예는 다음과 같습니다.
    Command cmd = new Command("cursor_test", conn)
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("cursor1", Type.Cursor).Direction =
    ParameterDirection.Output;
    cmd.Parameters.Add("cursor2", Type.Cursor).Direction =
    ParameterDirection.Output;
    
    cmd.ExecuteNonQuery();
    

    응용프로그램이 Db2 for z/OS 버전 10이상의 서버에 연결되어 있는 경우, 응용프로그램은 사용자가 호출하는 스토어드 프로시저의 입력 매개변수에 올바른 데이터 유형을 지정해야 합니다. 애플리케이션이 입력 매개변수의 데이터 유형과 일치하지 않는 매개변수를 지정하는 경우에는 유효하지 않은 변환 오류가 리턴됩니다.

  4. Command.ExecuteNonQuery() 함수를 실행하여 스토어드 프로시저를 호출하십시오.
    C# 코드 예는 다음과 같습니다.
    cmd.ExecuteNonQuery();
    OUT 또는 INOUT 매개변수가 있는 경우에는 DataReader 오브젝트를 사용하여 매개변수 값을 얻을 수 있습니다. C# 코드 예는 다음과 같습니다.
    DataReader  drOutput2 = cmd.Parameters[1].Value;
    DataReader  drOutput1 = cmd.Parameters[0].Value
    IBM 은 다음 조건이 충족될 때 내재적 COMMIT문을 전송하는 것과 연관된 추가 네트워크 트래픽을 저장합니다.
    • 연결된 데이터베이스 서버는 새 기능 모드 (NFM) 의 Db2 for z/OS 버전 11입니다.
    • 애플리케이션이 BeginTransaction 메소드를 호출하지 않습니다.
    • 스토어드 프로시저가 실행을 완료할 때 열려 있는 결과 세트가 없습니다.

CommandType.Text가 있는 C# 코드 예는 다음과 같습니다.
// assume a DB2Connection conn
DB2Transaction trans = conn.BeginTransaction();
DB2Command cmd = conn.CreateCommand();
String procName = "INOUT_PARAM";
String procCall = "CALL INOUT_PARAM (@param1, @param2, @param3)";
cmd.Transaction = trans;
cmd.CommandType = CommandType.Text;
cmd.CommandText = procCall;

// Register input-output and output parameters for the DB2Command
cmd.Parameters.Add( new DB2Parameter("@param1", "Value1");
cmd.Parameters.Add( new DB2Parameter("@param2", "Value2");
DB2Parameter param3 = new DB2Parameter("@param3", IfxType.Integer);
param3.Direction = ParameterDirection.Output;
cmd.Parameters.Add( param3 );


// Call the stored procedure
Console.WriteLine("  Call stored procedure named " + procName);
cmd.ExecuteNonQuery();
CommandType.Text가 있는 Visual Basic 코드 예는 다음과 같습니다.
' assume a DB2Connection conn
Dim trans As DB2Transaction = conn.BeginTransaction()
Dim cmd As DB2Command = conn.CreateCommand()
Dim procName As String = "INOUT_PARAM"
Dim procCall As String = "CALL INOUT_PARAM (?, ?, ?)"
cmd.Transaction = trans
cmd.CommandType = CommandType.Text
cmd.CommandText = procCall

' Register input-output and output parameters for the DB2Command
...

' Call the stored procedure
Console.WriteLine("  Call stored procedure named " & procName)
cmd.ExecuteNonQuery()
CommandType.StoredProcedure가 있는 C# 코드 예는 다음과 같습니다.
// assume a DB2Connection conn
DB2Transaction trans = conn.BeginTransaction();
DB2Command cmd = conn.CreateCommand();
String procName = "INOUT_PARAM";
cmd.Transaction = trans;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = procName;

// Register input-output and output parameters for the DB2Command
...

// Call the stored procedure
Console.WriteLine("  Call stored procedure named " + procName);
cmd.ExecuteNonQuery();
CommandType.StoredProcedure가 있는 Visual Basic 코드 예는 다음과 같습니다.
' assume a DB2Connection conn
Dim trans As DB2Transaction = conn.BeginTransaction()
Dim cmd As DB2Command = conn.CreateCommand()
Dim procName As String = "INOUT_PARAM"
cmd.Transaction = trans
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = procName

' Register input-output and output parameters for the DB2Command
...

' Call the stored procedure
Console.WriteLine("  Call stored procedure named " & procName)
cmd.ExecuteNonQuery()
ARRAY 입력 매개변수가 있는 C# 코드 예는 다음과 같습니다.
db2Command.CommandText = “arrayparamprocedure”;
db2Command.CommandType = CommandType.StoredProcedure;
Int32 integerArray = new Int32[] { 12, 34, 45, 67 };
DB2Parameter p1 = new DB2Parameter(“numbers_in”, DB2Type.Integer);
p1.Value = integerArray;
p1.ArrayLength = 3;
String[] stringArray = new String[] {“i think i know”, “but you never know”, “how much i know” };
DB2Parameter p2 = new DB2Parameter(“varchars_in”, DB2Type.Varchar, 30);
p2.Value = stringArray;
p2.ArrayLength = 2;
db2Command.Parameters.Add(p1);
db2Command.Parameters.Add(p2);
db2Command.ExecuteNonQuery();