다음을 통해 공유


WCF 서비스 모델을 사용하여 Oracle Database에서 작업 삽입, 업데이트, 삭제 또는 선택

Oracle 데이터베이스용 Microsoft BizTalk 어댑터는 Oracle 데이터베이스 테이블 및 뷰에서 기본 삽입, 업데이트, 삭제 및 선택 작업 집합을 표시합니다. 이러한 작업을 사용하면 대상 테이블 또는 뷰에서 WHERE 절로 한정된 간단한 SQL INSERT, UPDATE, SELECT 및 DELETE 문을 수행할 수 있습니다. JOIN 연산자를 사용하는 SQL SELECT 쿼리와 같이 더 복잡한 작업을 수행하려면 SQLEXECUTE 작업을 사용할 수 있습니다. SQLEXECUTE 작업에 대한 자세한 내용은 WCF 서비스 모델을 사용하여 Oracle Database에서 SQLEXECUTE 작업 수행을 참조하세요.

다음 표에는 Oracle 데이터베이스 어댑터가 테이블 및 뷰에 표시하는 기본 SQL 작업이 요약되어 있습니다. 이러한 작업에 대한 전체 설명은 테이블 및 뷰에서 기본 삽입, 업데이트, 삭제 및 선택 작업에 대한 메시지 스키마를 참조하세요.

작업(Operation) Description
삽입 삽입 작업은 대상 테이블 또는 뷰에 여러 레코드 또는 대량 삽입을 지원합니다.

- 여러 레코드 삽입 작업은 제공된 레코드 집합에 따라 테이블 또는 뷰에 행을 삽입합니다.
- 대량 삽입 작업은 제공된 SQL SELECT 쿼리 및 열 목록에 따라 테이블 또는 뷰에 행을 삽입합니다. 쿼리가 반환하는 레코드는 열 목록을 기반으로 대상 테이블에 삽입됩니다.
선택 제공된 열 이름 목록과 SQL WHERE 절을 지정하는 필터 문자열을 기반으로 대상 테이블에서 SQL SELECT 쿼리를 수행합니다.
업데이트 대상 테이블에서 UPDATE를 수행합니다. 업데이트할 레코드는 SQL WHERE 절을 지정하는 필터 문자열로 지정됩니다. 업데이트 값은 템플릿 레코드에 지정됩니다.
삭제 필터 문자열에 지정된 SQL WHERE 절을 기반으로 대상 테이블에서 DELETE를 수행합니다.

이 항목에 사용된 예제 정보

이 항목의 예제에서는 /SCOTT/ACCOUNTACTIVITY 테이블을 사용합니다. 이 테이블을 생성하는 스크립트는 SDK 샘플과 함께 제공됩니다. SDK 샘플에 대한 자세한 내용은 SDK의 샘플을 참조하세요.

WCF 클라이언트 클래스

Oracle Database 어댑터가 표시하는 기본 SQL 작업에 대해 생성된 WCF 클라이언트의 이름은 다음 표와 같이 테이블 또는 뷰의 이름을 기반으로 합니다.

Oracle 데이터베이스 아티팩트 WCF 클라이언트 이름
테이블 [SCHEMA] Table[TABLE_NAME]Client
보기 [SCHEMA] 보기[VIEW_NAME]클라이언트

[SCHEMA] = Oracle 아티팩트 컬렉션; 예를 들어 SCOTT입니다.

[TABLE_NAME] = 테이블의 이름입니다. 예를 들어 ACCOUNTACTIVITY입니다.

[VIEW_NAME] = 보기의 이름입니다.

다음 표에서는 테이블의 기본 SQL 작업에 대한 메서드 서명을 보여 줍니다. 뷰 네임스페이스와 이름이 테이블의 네임스페이스를 대체한다는 점을 제외하면 보기의 서명은 동일합니다.

작업 메서드 시그니처
삽입 long Insert([TABLE_NS].[ TABLE_NAME]RECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY);
선택 [TABLE_NS]. [TABLE_NAME] RECORDSELECT[] Select(string COLUMN_NAMES, string FILTER);
업데이트 long Update([TABLE_NS].[ TABLE_NAME]RECORDUPDATE RECORDSET, 문자열 FILTER);
삭제 Long Delete(string FILTER);

[TABLE_NS] = 테이블 네임스페이스의 이름입니다. 예를 들어 microsoft.lobservices.oracledb._2007._03.SCOTT입니다. Table.ACCOUNTACTIVITY.

[TABLE_NAME] = 테이블의 이름입니다. 예를 들어 ACCOUNTACTIVITY입니다.

삽입, 업데이트 및 선택 작업에서 사용하는 레코드 형식은 모두 테이블 또는 뷰 네임스페이스에 정의되어 있습니다.

다음 코드는 /SCOTT/ACCOUNTACTIVITY 테이블의 삭제, 삽입, 선택 및 업데이트 작업에 대해 생성된 WCF 클라이언트 클래스에 대한 메서드 서명을 보여 줍니다.

public partial class SCOTTTableACCOUNTACTIVITYClient : System.ServiceModel.ClientBase<SCOTTTableACCOUNTACTIVITY>, SCOTTTableACCOUNTACTIVITY {  
  
    public long Delete(string FILTER);  
  
    public long Insert(microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY);  
  
    public microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDSELECT[] Select(string COLUMN_NAMES, string FILTER);  
  
    public long Update(microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE RECORDSET, string FILTER);  
}  

기본 SQL 작업 호출

WCF 클라이언트를 사용하여 테이블 또는 뷰에서 기본 SQL 작업을 호출하려면 다음 단계를 수행합니다.

  1. 대상 테이블 또는 뷰에 대한 WCF 클라이언트 클래스를 생성합니다. 이 클래스에는 대상 아티팩트에서 호출할 작업에 대한 메서드가 포함되어야 합니다.

  2. WCF 클라이언트 클래스의 instance 만들고 해당 메서드를 호출하여 테이블 또는 뷰에서 작업을 수행합니다.

    WCF 클라이언트 클래스를 만들고 Oracle 데이터베이스 어댑터에서 작업을 호출하는 방법에 대한 자세한 내용은 Oracle 데이터베이스 어댑터를 사용하는 WCF 서비스 모델 개요를 참조하세요.

    Oracle 데이터베이스 어댑터는 Oracle 데이터베이스의 트랜잭션 내에서 각 작업을 실행합니다. TransactionIsolationLevel 바인딩 속성을 설정하여 이 트랜잭션의 격리 수준을 제어할 수 있습니다. Oracle 데이터베이스 어댑터 바인딩 속성에 대한 자세한 내용은 Oracle 데이터베이스 바인딩 속성 용 BizTalk 어댑터 작업을 참조하세요.

    다음 섹션에서는 코드에서 각 기본 SQL 작업을 호출하는 방법에 대해 자세히 설명합니다.

삽입 작업

다음 표에서는 여러 레코드 삽입 및 대량 삽입 작업에 대한 매개 변수를 설정하는 방법을 보여 줍니다.

삽입 작업 유형 레코드 집합 COLUMN_NAMES QUERY
여러 레코드 대상에 삽입해야 하는 INSERTRECORDS 컬렉션입니다. null null
대량 null 대상에 있는 열 이름의 쉼표로 구분된 목록입니다. 예: "TID, ACCOUNT". 열 목록은 쿼리 결과를 삽입된 각 행에 배치할 열을 지정합니다. 쿼리는 숫자와 형식 모두에서 열 목록에 지정된 열과 일치하는 결과 집합을 반환해야 합니다. 대상에 삽입할 결과 집합을 반환하는 데이터베이스 테이블 또는 뷰의 SQL SELECT 쿼리입니다. 예를 들어 "SELECT (TID, ACCOUNT) FROM NEW_TRANSACTIONS WHERE ACCOUNT = 100001"입니다. 결과 집합은 숫자와 형식의 열 목록과 일치해야 합니다.

삽입 작업은 대상에 삽입된 레코드 수를 반환합니다.

중요

WCF 서비스 모델에서 삽입 작업에 사용되는 레코드 집합은 강력한 형식입니다. 레코드에서 nillable 열의 값을 null 로 설정하여 삽입 작업에서 해당 열을 제외할 수 있습니다. 그러나 nillable이 아닌 열의 값을 null로 설정할 수는 없습니다. 즉, 여러 레코드 삽입 작업에서 각 레코드의 nillable이 아닌 모든 열에 대한 값을 제공해야 합니다. 또한 WCF 서비스 모델을 사용하는 경우 기본 SQL 작업에 대한 스트리밍 지원이 없습니다. 여러 레코드 삽입 작업에 큰 레코드 집합이 포함된 경우 이는 중요한 고려 사항일 수 있습니다. 자세한 내용은 WCF 서비스 모델을 사용하여 기본 SQL 작업 호출의 제한 사항을 참조하세요.

다음 코드는 ACCOUNTACTIVITY 테이블을 대상으로 하는 여러 레코드 삽입 작업(두 개의 레코드)을 보여 줍니다.

// Insert records  
                using (SCOTTTableACCOUNTACTIVITYClient aaTableClient =   
                    new SCOTTTableACCOUNTACTIVITYClient("OracleDBBinding_SCOTT.Table.ACCOUNTACTIVITY"))  
                {  
                    long recsInserted;  
  
                    aaTableClient.ClientCredentials.UserName.UserName = "SCOTT";  
                    aaTableClient.ClientCredentials.UserName.Password = "TIGER";  
  
                    try  
                    {  
                        aaTableClient.Open();  
                    }  
                    catch (Exception ex)  
                    {  
                        // handle exception  
                        Console.WriteLine("Exception: " + ex.Message);  
                        throw;  
                    }  
  
                    // Do a multiple record Insert of 2 records for account 100001  
  
                    microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[] insertRecs =  
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[2];  
  
                                  TID__COMPLEX_TYPE tid = new TID__COMPLEX_TYPE();  
                                  tid.InlineValue = "tidSequence.NextVal()";  
  
                                  ACCOUNT__COMPLEX_TYPE account = new ACCOUNT__COMPLEX_TYPE();  
                                  account.Value = 100001;  
  
                    AMOUNT__COMPLEX_TYPE amount = new AMOUNT__COMPLEX_TYPE();  
                    amount.Value = 400;  
  
                    TRANSDATE__COMPLEX_TYPE transdate = new TRANSDATE__COMPLEX_TYPE();  
                    transdate.Value = DateTime.Now.Date;  
  
                    PROCESSED__COMPLEX_TYPE processed = new PROCESSED__COMPLEX_TYPE();  
                    processed.Value = "n";  
  
                    DESCRIPTION__COMPLEX_TYPE description1 = new DESCRIPTION__COMPLEX_TYPE();  
                    description1.Value = "Inserted Record #1";  
  
                    DESCRIPTION__COMPLEX_TYPE description2 = new DESCRIPTION__COMPLEX_TYPE();  
                    description2.Value = "Inserted Record #2";  
  
                    insertRecs[0] =   
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT();  
                    insertRecs[0].TID = tid;  
                    insertRecs[0].ACCOUNT = account;  
                    insertRecs[0].AMOUNT = amount;  
                    insertRecs[0].TRANSDATE = transdate;  
                    insertRecs[0].DESCRIPTION = description1;  
                    insertRecs[0].PROCESSED = processed;  
  
                    insertRecs[1] =   
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT();  
                    insertRecs[1].TID = tid;  
                    insertRecs[1].ACCOUNT = account;  
                    insertRecs[1].AMOUNT = amount;  
                    insertRecs[1].TRANSDATE = transdate;  
                    insertRecs[1].DESCRIPTION = description2;  
                    insertRecs[1].PROCESSED = processed;  
  
                    try  
                    {  
                        recsInserted = aaTableClient.Insert(insertRecs, null, null);  
                    }  
                    catch (Exception ex)  
                    {  
                        // handle exception  
                        Console.WriteLine("Exception: " + ex.Message);  
                        throw;  
                    }  
  
                    Console.WriteLine("Insert Done: {0} records inserted", recsInserted);  

작업 선택

다음 표에서는 선택 작업에 대한 매개 변수를 보여줍니다.

COLUMN_NAMES FILTER
대상에 있는 열 이름의 쉼표로 구분된 목록입니다. 예: "TID, ACCOUNT". 열 목록은 결과 집합에 반환되어야 하는 대상의 열을 지정합니다. 열 목록에 지정되지 않은 열은 반환된 레코드 집합의 .NET 기본값으로 설정됩니다. nillable 열의 경우 이 값은 null입니다. 쿼리의 대상 행을 지정하는 SQL WHERE 절의 내용입니다. 예를 들어 "DESCRIPTION = 'Insert Record #1'"입니다. 이 매개 변수를 null 로 설정하여 대상의 모든 행을 반환할 수 있습니다.

선택 작업은 대상의 행 형식에 따라 강력한 형식의 레코드 집합을 반환합니다.

중요

WCF 서비스 모델을 사용하는 경우 기본 SQL 작업에 대한 스트리밍 지원이 없습니다. 쿼리가 큰 레코드 집합을 반환하는 경우 WCF 채널 모델을 사용하여 성능을 향상시킬 수 있습니다. 자세한 내용은 WCF 서비스 모델을 사용하여 기본 SQL 작업 호출의 제한 사항을 참조하세요.

다음 코드는 ACCOUNTACTIVITY 테이블을 대상으로 하는 선택 작업을 보여 줍니다. 반환된 레코드는 콘솔에 기록됩니다.

// Declare a variable to hold the result set  
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDSELECT[] selectRecords;  
  
// Select all records and write them to the console  
try  
{  
    selectRecords = aaTableClient.Select("*", null);  
}  
catch (Exception ex)  
{  
    // handle exception  
}  
  
Console.WriteLine("ACCOUNTACTIVITY before any operations");  
for (int i = 0; i \< selectRecords.Length; i++)  
{  
    Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", selectRecords[i].TID,  
    selectRecords[i].ACCOUNT,  
    selectRecords[i].AMOUNT,  
    selectRecords[i].TRANSDATE,  
    selectRecords[i].DESCRIPTION);  
}  

참고

이 코드는 WCF 클라이언트 instance 만들고 구성하고 여는 단계를 생략합니다. 이러한 단계를 포함하는 예제는 삽입 작업을 참조하세요.

업데이트 작업

다음 표에서는 업데이트 작업에 대한 매개 변수를 보여줍니다.

레코드 집합 FILTER
대상의 행 형식을 기반으로 하는 강력한 형식의 템플릿 레코드입니다. 템플릿 레코드는 대상 행에 대한 업데이트 값을 지정합니다. nillable 행 열의 경우 null 값을 지정하여 대상 행에서 열을 업데이트해서는 안 됨을 나타낼 수 있습니다. 대상에서 업데이트할 행을 지정하는 SQL WHERE 절의 내용입니다. 예를 들어 "DESCRIPTION= 'Inserted Record #1'"입니다.

업데이트 작업은 대상에서 삭제된 행 수를 반환합니다.

중요

WCF 서비스 모델에서 업데이트 작업에 사용되는 템플릿 레코드는 강력한 형식입니다. 열이 nillable이면 템플릿 레코드에서 해당 값을 null 로 설정하여 업데이트 작업에서 열을 생략할 수 있습니다. 그러나 열이 nillable이 아닌 경우 템플릿 레코드에서 해당 값을 설정해야 합니다. 예를 들어 열이 기본 키인 경우 값이 포함되어야 합니다. 자세한 내용은 WCF 서비스 모델을 사용하여 기본 SQL 작업 호출의 제한 사항을 참조하세요.

다음 코드는 ACCOUNTACTIVITY 테이블을 대상으로 하는 업데이트 작업을 보여 줍니다.

long recsUpdated;  
  
...  
  
// Create updated template. The TID, TIME, AMOUNT, and DESCRIPTION fields will be updated  
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE updateRecord =  
    new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE();  
        updateRecord.TID = tidSequence.NextVal();  
        updateRecord.ACCOUNT = null;  
        updateRecord.AMOUNT = 300;  
        updateRecord.TRANSDATE = DateTime.Now.Date;  
        updateRecord.DESCRIPTION = "Updated Record #2";  
        updateRecord.PROCESSED = null;  
  
// Set filter string to specify the target record by using the DESCRIPTION field  
string filter = "DESCRIPTION = 'Inserted Record #2'";  
  
try  
{  
    recsUpdated = aaTableClient.Update(updateRecord, filter);  
}  
catch (Exception ex)  
{  
    // handle exception  
    ...  
}  
  
Console.WriteLine("{0} records updated", recsUpdated);  

참고

이 코드는 WCF 클라이언트 instance 만들고 구성하고 여는 단계를 생략합니다. 이러한 단계를 포함하는 예제는 삽입 작업을 참조하세요.

삭제 작업

다음 표에서는 삭제 작업에 대한 매개 변수를 보여줍니다.

FILTER
대상에서 삭제할 행을 지정하는 SQL WHERE 절의 내용입니다. 예를 들어 "DESCRIPTION= 'Inserted Record #1'"입니다.

삭제 작업은 대상에서 삭제된 행 수를 반환합니다. 다음 코드는 ACCOUNTACTIVITY 테이블을 대상으로 하는 삭제 작업을 보여 줍니다.

// Set filter string equal to the DESCRIPTION field of the target record  
string filter = "DESCRIPTION = 'Inserted Record #1'";  
  
try  
{  
    recsDeleted = aaTableClient.Delete(filter);  
}  
catch (Exception ex)  
{  
    // handle exception  
  
    ...  
}  
Console.WriteLine("{0} records deleted", recsDeleted);  

참고

이 코드는 WCF 클라이언트 instance 만들고 구성하고 여는 단계를 생략합니다. 이러한 단계를 포함하는 예제는 삽입 작업을 참조하세요.

WCF 서비스 모델을 사용하여 기본 SQL 작업 호출의 제한 사항

WCF 클라이언트를 사용하여 기본 SQL 작업을 호출할 때 다음과 같은 제한 사항이 있습니다.

  • 삽입 작업. 여러 레코드 삽입 작업에 사용되는 레코드 집합은 강력한 형식이므로 모든 행 열이 포함됩니다. Oracle Database 어댑터는 레코드의 null 값을 해석하여 열이 삽입 작업에서 제외되어야 했음을 의미합니다. 그러나 null이 아닌 열은 null 값으로 설정할 수 없으므로 제외할 수 없습니다. 따라서 여러 레코드 삽입 작업을 수행할 때 nillable이 아닌 열의 값을 지정해야 합니다.

  • 삽입 작업. Oracle Database 어댑터는 nillable 데이터 열의 DbNull 값을 해석하여 열이 여러 레코드 삽입 작업에서 제외되어야 했음을 의미합니다. 즉, 여러 레코드 삽입 작업에서 Oracle 데이터베이스에서 nillable 열을 DbNull 로 설정할 수 없습니다.

  • 삽입 작업. 큰 레코드 집합을 포함하는 여러 레코드 삽입 작업에 대한 스트리밍 지원은 없습니다.

  • 업데이트 작업. 업데이트 작업에 사용되는 템플릿 레코드는 강력한 형식이므로 모든 행 열이 포함됩니다. Oracle Database 어댑터는 이 레코드의 null 값을 해석하여 열이 업데이트 작업에서 제외되어야 했음을 의미합니다. 그러나 null이 아닌 열은 null 값으로 지정할 수 없으므로 제외할 수 없습니다. 따라서 업데이트 작업을 수행할 때 nillable이 아닌 열의 값을 지정해야 합니다.

  • 업데이트 작업. Oracle Database 어댑터는 템플릿 레코드의 nillable 데이터 열에서 DbNull 값을 해석하여 열이 작업에서 제외되어야 했음을 의미합니다. 즉, 업데이트 작업을 사용하여 Oracle 데이터베이스에서 nillable 열을 DbNull 로 설정할 수 없습니다.

  • 작업을 선택합니다. 큰 레코드 집합을 반환하는 SELECT 쿼리에 대한 스트리밍 지원은 없습니다.

    이러한 제한 사항에 문제가 있는 시나리오의 경우 다음과 같은 이유로 WCF 채널 모델을 사용하여 작업을 호출할 수 있습니다.

  • WCF 채널 모델을 사용하면 업데이트 및 삽입 작업에서 특정 데이터 열을 제외할 수 있습니다.

  • WCF 채널 모델은 Oracle 데이터베이스 어댑터가 노출하는 기본 SQL 작업에 대한 노드 수준 스트리밍 지원을 제공합니다.

    Oracle 데이터베이스 어댑터와 함께 WCF 채널 모델을 사용하는 방법에 대한 자세한 내용은 WCF 채널 모델을 사용하여 Oracle 데이터베이스 애플리케이션 개발을 참조하세요.

참고 항목

WCF 채널 모델을 사용하여 Oracle 데이터베이스 애플리케이션 개발